繁体   English   中英

从Java程序向stdout添加日期戳

[英]Add a date stamp to stdout from a Java program

我有一个在启动时运行的服务,该服务会启动启动Java程序的Shell脚本。 程序中的stdout / stderr被转储到日志文件中,通常这最终只是运行时异常。 但是,问题是,尽管它可以将异常记录到日志文件中,但它没有任何日期戳让我知道豁免发生的时间。

nohup /my/program/start.sh >> /my/log.lg 2>&1&

如何捕获异常并用时间/日期戳记日志?

System.outSystem.err

Java通过System类支持stdoutstderr 标准流 ,这是为方便起见已实例化的一对PrintStream对象。

例:

System.out.println( "Bonjour tous le monde." ) ;
System.err.println( "Oops, a tear in the fabric of space-time has occurred." ) ;

如果预期的输出未能显示,请检查Java代码。 也许已使用日志记录框架来转移此类输出。

Instant

…并用时间/日期戳记下日志

至于时间戳,通常最好在UTC中而不是特定时区进行所有登录。 使用Instant类。

Instant类以UTC表示时间轴上的时刻,分辨率为纳秒 (最多十进制的九(9)位数字)。 根据Java的实现以及主机操作系统和硬件的限制,当前时刻可能以毫秒或微秒(而不是纳秒)为单位捕获。

默认情况下, Instant::toString生成标准ISO 8601格式的字符串,例如2018-01-23T12:34:56.123456Z

System.out.println( "Current moment is: " + Instant.now().toString() ) ;
System.err.println( "Oops, error occurred at: " + Instant.now() ) ;

记录异常

我如何捕获异常…

学习有关异常Oracle教程 ,特别是捕获和处理异常一节

将代码包装在可能通过try-catch引发异常try-catch

try {
    …
} catch (ExceptionType name) {
    …
} catch (ExceptionType name) {
    …
}

教程中的示例。

try {
    …

} catch (IndexOutOfBoundsException name) {
    System.err.println( "IndexOutOfBoundsException: " + e.getMessage() );

} catch (IOException name) {
    System.err.println( "Caught IOException: " + e.getMessage() );

}

根据需要插入时间戳。

try {
    …

} catch (IndexOutOfBoundsException name) {
    System.err.println( "Caught IndexOutOfBoundsException at " + Instant.now() + ": " + e.getMessage() );

} catch (IOException name) {
    System.err.println( "Caught IOException at " + Instant.now() + ": " + e.getMessage() );

}

记录框架

最终,您可以选择通过日志记录框架处理所有此类进度和错误报告。 您可以通过目标的任何组合(包括标准流,本地日志文件,寻呼机/ SMS和远程日志记录服务)定向输出。

我建议使用slf4j外墙。 您可以通过适配器插头已经使用的旧式日志记录工具到SLF4J,或新建工作中使用直接实现SLF4J的, 的logback


关于java.time

java.time框架内置于Java 8及更高版本中。 这些类取代了麻烦的旧的旧式日期时间类,例如java.util.DateCalendarSimpleDateFormat

现在处于维护模式Joda-Time项目建议迁移到java.time类。

要了解更多信息,请参见Oracle教程 并在Stack Overflow中搜索许多示例和说明。 规格为JSR 310

您可以直接与数据库交换java.time对象。 使用与JDBC 4.2或更高版本兼容的JDBC驱动程序 不需要字符串,不需要java.sql.*类。

在哪里获取java.time类?

ThreeTen-Extra项目使用其他类扩展了java.time。 该项目为将来可能在java.time中添加内容提供了一个试验场。 您可以在这里找到一些有用的类,比如IntervalYearWeekYearQuarter ,和更多

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM