【问题标题】:log4j : current time in millisecondslog4j :当前时间,以毫秒为单位
【发布时间】:2012-08-01 10:31:14
【问题描述】:

log4j.properties 我可以设置PatternLayout 例如("[%p] %c - %m - %d %n")

是否有任何符号 (%something) 以毫秒为单位返回当前时间?

【问题讨论】:

  • 是否有理由需要以毫秒为单位捕获日志时间?无论如何,日志都是按执行顺序打印的。
  • @RajeshJAdvani 我尝试从分布式系统收集日志并计算它们之间的时间差。生成日志时我需要可靠的信息。

标签: java log4j


【解决方案1】:

你可以试试这个。

log4j.appender.appender_name.layout=org.apache.log4j.PatternLayout
log4j.appender.appender_name.layout.ConversionPattern=%d %p [%c] - %m%n

日期参数%d。例如:%d{HH:mm:ss,SSS}

http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/PatternLayout.html

【讨论】:

  • 不要使用PatternLayout!充满并发问题,并不总是喜欢异常语句。答案是EnhancedPatternLayout。
【解决方案2】:

试试这个,

   %d{dd MMM yyyy HH:mm:ss,SSS}

【讨论】:

    【解决方案3】:

    你应该可以从manual使用%d{UNIX_MILLIS}

    %d{UNIX} 以秒为单位输出 UNIX 时间。 %d{UNIX_MILLIS} 以毫秒为单位输出 UNIX 时间。 UNIX 时间是当前时间与 UTC 1970 年 1 月 1 日午夜之间的差异,对于 UNIX,以秒为单位,对于 UNIX_MILLIS,以毫秒为单位。虽然时间单位是毫秒,但粒度取决于操作系统 (Windows)。这是输出事件时间的一种有效方式,因为只发生从 long 到 String 的转换,不涉及日期格式。

    【讨论】:

    • 手册还说 %d{ISO8601} 以获得 ISO 8601,但事实并非如此,所以我不确定我是否可以再信任它。
    • 非常非常完美的解决方案
    • Could not instantiate SimpleDateFormat with UNIX Could not instantiate SimpleDateFormat with UNIX_MILLIS java.lang.IllegalArgumentException: Illegal pattern character 'U' 似乎ABSOLUTEDATEISO8601 有三个显式检查,如果它们都不是,则将字符串传递给SimpleDateFormat逐字逐句。
    • 太棒了!非常感谢。但是注意一定是2.x版本(前段时间暴露安全漏洞的那个)
    【解决方案4】:

    没有完全符合您要求的 Log4J 符号。

    %d 返回具有给定模式的当前日期,该模式由SimpleDateFormat(您放在括号中的模式)定义,但不会以毫秒为单位提供时间。

    %r 给出自执行开始以来的毫秒数

    实现您想要的一种可能的方法是扩展 Log4j 的行为,它相当复杂,但如果它绝对有必要......你去吧:

    Customize log4j(编辑:不再在线?)
    Customize log4j(编辑:2018 替代方案)

    编辑: 请记住,根据您的评论,如果您需要计算不同机器中执行之间的时间差异,您必须确保机器的时钟是同步的,否则会导致您得出错误的结论。

    【讨论】:

    • 我不同意这是不可能的。 %d 符号实际上作为默认值显示毫秒,而您可以将其配置为关闭它。采样时间:2012 年 8 月 1 日 17:41:53,357。使用的符号:%d{dd MMM yyyy HH:mm:ss,SSS}
    • 这是日期的毫秒数,而不是日期的毫秒数。这是完全不同的。从最初的问题来看,OP 要求的是一种打印时间戳 in 毫秒的方法。请在投票前阅读。
    • 好的,同意。我想删除我的反对票,但因为时间已经过去了,所以不能。但是如果 OP 需要比较来自多个系统的日志,(s)他仍然可以使用时间 WITH 毫秒并自己进行计算 - givenDateFormat.parse(dateString).getTime()。它比扩展 log4j 更简单,并且也可以处理以前生成的日志文件。
    • @Rajesh:Log4j 中的日期处理使用 Java 极其缓慢的 Date api。从字面上看,可以通过抓取 System.currentTimeMillis() 将每个日志语句的执行时间缩短几毫秒或几十毫秒。这对于登录到数据库的人来说特别有用,因为他们可以在实际速度更快的地方放弃日期计算!
    猜你喜欢
    • 2010-10-02
    • 1970-01-01
    • 2011-10-25
    • 2017-02-20
    • 1970-01-01
    • 1970-01-01
    • 2017-04-25
    • 1970-01-01
    相关资源
    最近更新 更多