从Java程序向stdout添加日期戳

时间:2018-05-15 12:14:41

标签: java bash service

我有一个在启动时运行的服务,它启动一个启动java程序的shell脚本。程序中的stdout / stderr被转储到日志文件中,通常这只是运行时异常。但问题是,当它将异常记录到日志文件时,它没有任何类型的日期戳,以便在发生豁免时通知我。

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

如何捕获异常并使用时间/日期标记记录它们?

1 个答案:

答案 0 :(得分:1)

System.out& System.err

Java支持stdout和& stderr standard streams通过System类作为一对PrintStream对象已经实例化,以方便您使用。

示例:

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

如果您的预期输出无法显示,请检查您的Java代码。也许用logging framework来转移这种输出。

Instant

  

...并使用时间/日期标记记录它们

对于时间戳,通常最好在UTC而不是特定时区进行所有日志记录。使用Instant类。

Instant类代表UTC中时间轴上的一个时刻,分辨率为nanoseconds(小数部分最多九(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 Tutorial on exceptions,特别是Catching and Handling Exceptions部分。

使用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() );

}

记录框架

最终,您可以选择处理所有此类进展&通过logging framework报告错误。您可以通过任何目标组合来引导输出,包括标准流,本地日志文件,寻呼机/ SMS和远程日志记录服务。

我建议使用slf4j外观。您可以通过适配器将已经使用的旧式日志记录工具插入slf4j,或者greenfield工作使用slf4j的直接实现,Logback

关于 java.time

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

现在位于Joda-Timemaintenance mode项目建议迁移到java.time类。

要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310

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

从哪里获取java.time类?

ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如IntervalYearWeekYearQuartermore