You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 07:32:22