如何使用hslogger输出带时间戳和优先级的日志并将INFO日志输出到标准输出?
解决hslogger日志缺少时间戳和优先级的问题
你的问题是因为hslogger默认的标准输出处理器没有包含时间戳和优先级信息,我们需要自定义日志处理器和格式化规则来实现你想要的输出格式。下面是修改后的完整代码:
import System.Log.Logger (Priority(..), infoM, errorM, rootLoggerName, setLevel, updateGlobalLogger, addHandler) import System.Log.Handler (setFormatter) import System.Log.Handler.Simple (streamHandler) import System.Log.Formatter (LogFormatter) import System.IO (stdout) import Data.Time.Format (formatTime, defaultTimeLocale) import Data.Time.Clock (getCurrentTime, UTCTime) -- 自定义日志格式化函数,生成你需要的格式 customFormatter :: LogFormatter a customFormatter time _ prio msg = let -- 格式化UTC时间为指定格式:年-月-日 时:分:秒.毫秒Z formattedTime = formatTime defaultTimeLocale "%Y-%m-%d %H:%M:%S.%qZ" time -- 将优先级转为字符串(默认已是大写格式) prioStr = show prio in "[" ++ formattedTime ++ "] [" ++ prioStr ++ "] " ++ msg main :: IO () main = do -- 创建指向标准输出的日志处理器,设置最低日志级别为INFO stdoutHandler <- streamHandler stdout INFO -- 给处理器绑定自定义格式化函数 let formattedHandler = setFormatter stdoutHandler customFormatter -- 更新全局根日志器:设置级别,并添加我们自定义的处理器 updateGlobalLogger rootLoggerName $ setLevel INFO . addHandler formattedHandler -- 测试日志输出 infoM "main" "starting" errorM "main" "something wrong"
关键步骤解释:
- 导入必要模块:新增了日志处理器、格式化器相关的模块,以及时间处理模块来生成符合要求的时间戳。
- 自定义格式化函数:
customFormatter函数接收当前时间、日志器名称(这里我们未使用)、日志优先级和消息内容,按照你想要的格式拼接成最终的日志字符串。其中%q用于输出毫秒级时间,Z标记这是UTC时间。 - 创建并配置处理器:用
streamHandler创建标准输出的处理器,再通过setFormatter绑定我们的自定义格式规则。 - 更新全局日志器:除了设置日志级别,还要把自定义处理器添加到根日志器中,这样所有日志都会使用我们的格式输出。
运行修改后的代码,你会得到如下格式的日志输出:
[2024-05-20 14:35:22.456Z] [INFO] starting [2024-05-20 14:35:22.456Z] [ERROR] something wrong
内容的提问来源于stack exchange,提问作者Leo Zhang
相关产品推荐
相关产品推荐

