Log4net:如何根据请求参数生成不同的日志文件名?
当然可以实现!而且完全不用修改你现有的Log.Debug()这类日志调用语句,下面分两部分给你讲清楚适配你需求的解决方案:
一、自定义RollingFileAppender实现动态日志文件
完全可以通过自定义RollingFileAppender来实现按SPHostUrl分日志文件的需求,核心思路是在日志写入时动态从HttpContext中提取SPHostUrl参数,解析出源域名后替换日志文件名。
具体实现步骤:
- 继承
RollingFileAppender,重写Append方法(或者文件路径相关的逻辑),每次写入日志前动态生成对应源的文件名 - 解析SPHostUrl时用
Uri类提取域名,同时处理特殊字符避免文件名异常 - 确保每次写入前更新文件流,避免缓存旧的文件名
给你一个简单的实现示例:
public class SPHostRollingFileAppender : RollingFileAppender { protected override void Append(LoggingEvent loggingEvent) { // 从HttpContext获取SPHostUrl参数 var spHostUrl = HttpContext.Current?.Request.QueryString["SPHostUrl"]; string hostIdentifier = "unknown"; if (!string.IsNullOrEmpty(spHostUrl) && Uri.TryCreate(spHostUrl, UriKind.Absolute, out var uri)) { // 把域名里的点换成下划线,避免操作系统文件名问题 hostIdentifier = uri.Host.Replace(".", "_"); } // 动态设置日志文件名 this.File = $"applicationlog.{hostIdentifier}.log"; // 重新激活配置,确保文件流更新为新的日志文件 this.ActivateOptions(); base.Append(loggingEvent); } }
配置的时候,在web.config里把appender的type指定为你这个自定义类的完整命名空间+类名即可,不用为每个源单独配置appender——新的源会自动生成对应的日志文件。
二、无需修改日志调用,自动将SPHostUrl加入PatternLayout
如果你还想把SPHostUrl信息直接写入日志内容里(同时不修改现有Log.Debug()等调用),可以自定义PatternLayoutConverter,给log4net添加一个自定义的占位符,自动从HttpContext中提取参数。
- 先实现自定义转换器:
public class SPHostUrlPatternConverter : PatternLayoutConverter { protected override void Convert(TextWriter writer, LoggingEvent loggingEvent) { var spHostUrl = HttpContext.Current?.Request.QueryString["SPHostUrl"]; string hostName = "unknown"; if (!string.IsNullOrEmpty(spHostUrl) && Uri.TryCreate(spHostUrl, UriKind.Absolute, out var uri)) { hostName = uri.Host; } writer.Write(hostName); } }
- 在web.config的layout配置中注册这个转换器,并在格式里使用自定义占位符
%sphosturl:
<appender name="SPHostRollingFileAppender" type="YourNamespace.SPHostRollingFileAppender"> <appendToFile value="true" /> <rollingStyle value="Size" /> <maxSizeRollBackups value="5" /> <maximumFileSize value="10MB" /> <staticLogFileName value="false" /> <layout type="log4net.Layout.PatternLayout"> <!-- 注册自定义转换器 --> <converter> <name value="sphosturl" /> <type value="YourNamespace.SPHostUrlPatternConverter" /> </converter> <!-- 在格式中加入自定义占位符 --> <conversionPattern value="%date [%thread] %-5level %logger - %sphosturl - %message%newline" /> </layout> </appender>
这样一来,日志内容里会自动带上对应的SPHostUrl域名,同时结合上面的自定义Appender,就能同时实现按源分日志文件和日志内容包含源信息的需求,全程不需要修改任何现有日志调用代码,也不用为每个新增的源手动配置appender。
内容的提问来源于stack exchange,提问作者Ole Albers
相关产品推荐
相关产品推荐

