拦截 nlog 中的日志消息
Intercepting log messages in nlog
我们需要拦截 nlog 正在写入磁盘的条目,以便任何 URLs/IP 地址和类似的安全敏感信息都可以被混淆或以某种方式编码。
例如,如果记录了任何 URL,则应从
http://servername:2212/webservice
到
(http)://servername/2212/webservice
是否有任何 nlog 模式可以采用正则表达式并转换为另一个字符串?
或者是否可以通过拦截日志文件的写入来实现?
任何帮助、建议或重定向都会很有帮助。
我们正在使用 .NET 4.5、nlog 4.4、C#
写一个wrapper layoutrenderer,你可以比所有的layout renderer都wrapper。 .例如如果你有 ${message}${exception}
布局,它将是
${intercept:inner=${message}${exception}}
代码:
[LayoutRenderer("intercept")]
public sealed class InterceptLayoutRendererWrapper : WrapperLayoutRendererBase
{
/// <summary>
/// Option you could set from config or code
/// </summary>
[DefaultValue(true)]
public bool Option1 { get; set; }
/// <summary>
/// Renders the inner layout contents.
/// OR override TransformFormattedMesssage, and change the stringbuilder (less string allocations)
/// </summary>
/// <param name="logEvent">The log event.</param>
/// <returns>Contents of inner layout.</returns>
protected override string RenderInner(LogEventInfo logEvent)
{
var text = this.Inner.Render(logEvent);
return interceptSomething(text);
}
}
并注册:
LayoutRenderer.Register<InterceptLayoutRendererWrapper>("intercept");
我们需要拦截 nlog 正在写入磁盘的条目,以便任何 URLs/IP 地址和类似的安全敏感信息都可以被混淆或以某种方式编码。
例如,如果记录了任何 URL,则应从 http://servername:2212/webservice 到 (http)://servername/2212/webservice
是否有任何 nlog 模式可以采用正则表达式并转换为另一个字符串?
或者是否可以通过拦截日志文件的写入来实现?
任何帮助、建议或重定向都会很有帮助。
我们正在使用 .NET 4.5、nlog 4.4、C#
写一个wrapper layoutrenderer,你可以比所有的layout renderer都wrapper。 .例如如果你有 ${message}${exception}
布局,它将是
${intercept:inner=${message}${exception}}
代码:
[LayoutRenderer("intercept")]
public sealed class InterceptLayoutRendererWrapper : WrapperLayoutRendererBase
{
/// <summary>
/// Option you could set from config or code
/// </summary>
[DefaultValue(true)]
public bool Option1 { get; set; }
/// <summary>
/// Renders the inner layout contents.
/// OR override TransformFormattedMesssage, and change the stringbuilder (less string allocations)
/// </summary>
/// <param name="logEvent">The log event.</param>
/// <returns>Contents of inner layout.</returns>
protected override string RenderInner(LogEventInfo logEvent)
{
var text = this.Inner.Render(logEvent);
return interceptSomething(text);
}
}
并注册:
LayoutRenderer.Register<InterceptLayoutRendererWrapper>("intercept");