log4hs-0.2.0.0: src/Logging/Utils.hs
module Logging.Utils
( addZonedTime
, diffZonedTime
, zonedTimeToPOSIXSeconds
, timestamp
, seconds
, milliseconds
, microseconds
, openLogFile
, rotateFile
, modifyBaseName
) where
import Control.Monad
import Data.Time.Clock
import Data.Time.Clock.POSIX
import Data.Time.LocalTime
import System.Directory
import System.Environment
import System.FilePath
import System.IO
addZonedTime :: NominalDiffTime -> ZonedTime -> ZonedTime
addZonedTime ndt zt@(ZonedTime _ tz) =
utcToZonedTime tz $ addUTCTime ndt $ zonedTimeToUTC zt
diffZonedTime :: ZonedTime -> ZonedTime -> NominalDiffTime
diffZonedTime zt1 zt2 = diffUTCTime (zonedTimeToUTC zt1) (zonedTimeToUTC zt2)
zonedTimeToPOSIXSeconds :: ZonedTime -> NominalDiffTime
zonedTimeToPOSIXSeconds = utcTimeToPOSIXSeconds . zonedTimeToUTC
timestamp :: NominalDiffTime -> Double
timestamp = fromRational . toRational
seconds :: NominalDiffTime -> Integer
seconds = truncate
milliseconds :: NominalDiffTime -> Integer
milliseconds = truncate . (* 1000)
microseconds :: NominalDiffTime -> Integer
microseconds = truncate . (* 1000000)
openLogFile :: FilePath -> TextEncoding -> IO Handle
openLogFile path encoding = do
absPath <- makeAbsolute path
progName <- getProgName
let dir = takeDirectory absPath
file = if dir == absPath then dir </> (progName ++ ".log") else absPath
createDirectoryIfMissing True dir
stream <- openFile file AppendMode
hSetEncoding stream encoding
return stream
rotateFile :: FilePath -> FilePath -> IO ()
rotateFile src dest = doesFileExist src >>= (flip when $ renameFile src dest)
modifyBaseName :: FilePath -> (String -> String) -> FilePath
modifyBaseName file modify = replaceBaseName file $ modify $ takeBaseName file