这几天在重新整理Log4net的日志记录功能。
需求:想把每台机器上记录的Log4日志文件归总在一台局域网LogServer上。
对配置文件代码做出的调整:
<log4net>
<appender name="ErrorLogger" type="log4net.Appender.RollingFileAppender">
<file type="log4net.Util.PatternString">
<conversionPattern value="\\192.168.1.110\log4net\Web\%date{yyyy}\%date{MM}\Logger_%date{yyyyMMdd}.log" />
</file>
<param name="AppendToFile" value="true" />
<param name="StaticLogFileName" value="true" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%d [%t] %-5p %c [%x] - %m%n" />
<!--%aspnet-request{UserHostAddress}-->
<param name="Header" value="[Header]
" />
<param name="Footer" value="[Footer]
" />
</layout>
</appender>
<root>
<!-- Setup the root category, add the appenders and set the default level -->
<!-- OFF, FATAL, ERROR, WARN, INFO, DEBUG, ALL -->
<level value="ALL" />
<appender-ref ref="ErrorLogger" />
</root>
</log4net>
其中,局域网机器192.168.1.110的log4net目录做了共享,并给予了Everyone读写权限。
结果:日志文件没有被按期望写入到指定的共享目录中。
后续验证:写了一个控制台的exe Log测试写入程序,配置文件与上述一样,上传到服务器后手动执行,日志文件写入成功,所以在想是否是IIS关于局域网机器的权限问题,查阅了很多资料,没有找到这方面的信息,特来园子恳请各位大神解惑!
如果是部署在 IIS 中的话,就会有 I/O 权限问题,你可以将应用程序池的用户设置为 LocalSystem,虽然这样不安全。
PS:如果是大规模日志写入的话,我还是建议你将日志作为服务部署。
谢谢你的建议!
我比较纳闷的是怎么不在LogServer上放个数据库,把日志写到数据库里。
这个我只想作为文件级别来存储,不需要再数据库中体现啊。
@维依: log4net改数据库方式很简单,何必用共享目录这么不安全还折腾的方式。
@liqipeng: 嗯 挺感谢你的建议,从安全性的角度来讲,我的初衷可能不是最好的解决方案。谢谢
使用WebService或者使用数据库都是比较好一点的方法,
你都一堆服务器了(最差也有两台),也不差弄个数据库或是写个WebService了吧。
不要为了方便让服务器的安全系数减少几十倍。
有道理,谢谢大神的提醒!感谢。是可以考虑用windows服务或者webservice接口的方式来进行实现。