我的团队继承了对100多个应用程序的支持.应用程序没有任何类型的通用体系结构,因此进行日志记录的应用程序通常使用自定义代码来执行本地文件或本地数据库,并且它们都是非托管的.我们想改变这一点.
我们正在慢慢地将应用程序迁移到使用log4net并标准化记录的事物类型.接下来的问题是:我们应该在哪里发送日志?
我认为使用专用于接收所有日志的中央SQL Server会很好,这将提供简单的维护(备份/归档的一个位置),并提供一些数据挖掘和趋势分析的未来可能性.
这是这种事情的最佳实践,还是有一些我们应该关注的专用应用程序日志记录服务器?
更新:我应该更清楚,而不仅仅是随便提一下log4net和SQL Server:我们是微软的家,大多数东西用.NET编写.UNIX解决方案对我们没有好处.
我的问题是,最好的方法是跟踪应用程序管理员的异常.(出于维护目的,通知管理员抛出的异常).
对于系统用户,我认为应该捕获异常并显示相应的错误消息. 我认为,对于系统管理员来说,最好的方法是让消息系统将每个异常的详细信息作为消息发送给接收方.一旦接收方收到新的错误消息,它就会在数据库中持续显示,或者向管理员发送一封包含异常详细信息的电子邮件.
try{
....
}
catch(Exception e){
//what to do here? how to notify admin?
}
Run Code Online (Sandbox Code Playgroud) 我有一个包含gzip压缩日志文件的目录,每行一个事件.为了实时读取和处理这些,我创建了一个与此处列出的代码相同的WatcherService:http://docs.oracle.com/javase/tutorial/essential/io/notification.html
在processEvents()方法中,我添加了此代码以逐行读取已添加或追加的文件:
if (kind == ENTRY_MODIFY) {
try(BufferedReader reader = new BufferedReader(new InputStreamReader(new GZIPInputStream(Files.newInputStream(child, StandardOpenOption.READ))))) {
String line;
while ((line = reader.readLine()) != null) {
System.out.println(line);
}
}
catch(EOFException ex) {
//file is empty, so ignore until next signal
}
catch(Exception ex) {
ex.printStackTrace();
}
}
Run Code Online (Sandbox Code Playgroud)
现在,正如您可以想象的那样,这对于在几毫秒内创建的已编写和关闭的文件非常有用,但是,当处理随时间附加的大文件时,这将为每个附加行反复读取整个文件(给定生成器现在然后刷新和同步文件).
有没有什么办法可以在每次发送ENTRY_MODIFY信号时只读取此文件中的新行,或者找出文件"完成"的时间?
如何处理未附加但被覆盖的文件?