[英]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.out
和System.err
Java通过System
类支持stdout
和stderr
标准流 ,这是为方便起见已实例化的一对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 8及更高版本中。 这些类取代了麻烦的旧的旧式日期时间类,例如java.util.Date
, Calendar
和SimpleDateFormat
。
现在处于维护模式的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中添加内容提供了一个试验场。 您可以在这里找到一些有用的类,比如Interval
, YearWeek
, YearQuarter
,和更多 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.