我有一个在启动时运行的服务,它启动一个启动java程序的shell脚本。程序中的stdout / stderr被转储到日志文件中,通常这只是运行时异常。但问题是,当它将异常记录到日志文件时,它没有任何类型的日期戳,以便在发生豁免时通知我。
nohup /my/program/start.sh>> /my/log.lg 2>& 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 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.Date
,Calendar
和& SimpleDateFormat
现在位于Joda-Time的maintenance 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的试验场。您可以在此处找到一些有用的课程,例如Interval
,YearWeek
,YearQuarter
和more。