在Windows Container中,没有写日志的情况下,如何排查系统的异常信息?
1 关于Windows事件日志
在以往基于IIS部署ASP.NET应用程序时,如果没有写指定日志的情况下,我们往往会使用Window事件日志来查看一些错误信息。
虽然事件日志的可读性和易用性不够好,但是还是可以帮助我们查看一些问题。这不,我在公司测试环境部署了我们团队的老系统(大单体ASP.NET MVC项目)的Service项目做POC试点验证,跑了几个接口之后发现系统直接返回503错误。对于第一次在Windows Container上跑ASP.NET MVC应用的我来说,有点懵,在容器内部查看IIS Log也没有足够的信息,我能想到的,就是去看事件日志了。
2 Docker下查看事件日志
Step1. 首先进入ASP.NET MVC容器实例内部:
代码语言:javascript复制>docker exec -it <container_name> powershell
Step2. 获取最新的20个事件日志,获得对应日志的Index:
代码语言:javascript复制>Get-Eventlog -newest 20 application
Index Time EntryType Source InstanceID Message
96 Jul 22 15:34 Information Windows Error Rep... 1001 Fault bucket , type 0...
95 Jul 22 15:34 Information Windows Error Rep... 1001 Fault bucket , type 0...
94 Jul 22 15:34 Information Windows Error Rep... 1001 Fault bucket , type 0...
93 Jul 22 15:34 Information Windows Error Rep... 1001 Fault bucket , type 0...
92 Jul 22 15:34 Information Windows Error Rep... 1001 Fault bucket , type 0...
91 Jul 22 15:34 Information Windows Error Rep... 1001 Fault bucket , type 0...
90 Jul 22 15:34 Error Application Error 1000 Faulting application name: w3wp.exe, version: 1...
89 Jul 22 15:34 Error .NET Runtime 1026 Application: w3wp.exe...
88 Jul 22 15:34 Error ASP.NET 4.0.30319.0 3221226797 An unhandled exception occurred and the process...
87 Jul 22 15:34 Information Windows Error Rep... 1001 Fault bucket , type 0...
86 Jul 22 15:34 Information Windows Error Rep... 1001 Fault bucket , type 0...
85 Jul 22 15:34 Information Windows Error Rep... 1001 Fault bucket , type 0...
84 Jul 22 15:34 Information Windows Error Rep... 1001 Fault bucket , type 0...
83 Jul 22 15:34 Information Windows Error Rep... 1001 Fault bucket , type 0...
......
Step3. 找到出错的那几个index,通过下面的命令查看错误日志:
代码语言:javascript复制>(Get-Eventlog -index 89 application).message
An unhandled exception occurred and the process was terminated.
Application ID: /LM/W3SVC/1/ROOT
Process ID: 7664
Exception: System.TypeInitializationException
Message: The type initializer for 'NewLife.Log.XTrace' threw an exception.
StackTrace: at NewLife.Log.XTrace.WriteException(Exception ex)
at NewLife.Threading.ThreadPoolX.<>c__DisplayClass2_0.<QueueUserWorkItem>b__0(Object s)
at System.Threading.QueueUserWorkItemCallback.System.Threading.IThreadPoolWorkItem.ExecuteWorkItem()
at System.Threading.ThreadPoolWorkQueue.Dispatch()
InnerException: System.UnauthorizedAccessException
Message: Access to the path 'C:inetpubwwwrootConfig' is denied.
StackTrace: at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
at System.IO.Directory.InternalCreateDirectory(String fullPath, String path, Object dirSecurityObj, Boolean checkHost
)
at System.IO.Directory.InternalCreateDirectoryHelper(String path, Boolean checkHost)
at System.IO.PathHelper.EnsureDirectory(String path, Boolean isfile)
......
从错误日志中可以看到,Config目录访问不到,经过调查发现,原来已有系统的IIS目录下有一个手动拷贝进去的Config目录(正确做法应该将其作为解决方案的一部分内容始终输出到release目录),于是乎将其拷贝到容器目录下,重新打镜像和运行,问题解决,平稳运行!
3 总结
本文介绍了如何在Windows Container中通过事件日志排查ASP.NET应用程序的异常日志信息,虽然文章很短小,但希望对你有用。
对于传统.NET 4.x应用的容器化迁移,我们也还在探索,相信探索和实践的深入,我会分享更多相关的内容。
作者:周旭龙
出处:https://edisonchou.cnblogs.com
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接。