在log4net中,我试图使用以下代码以编程方式添加每个实例的附加程序。
我会理解为什么对于RollingFileAppender,我必须写:
((Logger)log.Logger).AddAppender(newFileAppender);对于AdoNetAppenders,我必须写:
hierarchy.Root.AddAppender(newAdoNetAppender);如果我写:
hierarchy.Root.AddAppender(newFileAppender);它将记录每一行两次。
如果我写:
((Logger)log.Logger).AddAppender(newAdoNetAppender);它不会登录数据库。
或者可能还有其他的错误?
Global.asax
XmlConfigurator.ConfigureAndWatch(new FileInfo("Foo.xml"));财产定义:
LogicalThreadContext.Properties["InstanceName"] = instance;码
public static void SetLog4NetAppenderOptions(ILog log, string instanceName)
{
Hierarchy hierarchy = LogManager.GetRepository() as Hierarchy;
if (hierarchy != null)
{
RollingFileAppender genericFileAppender = (RollingFileAppender)hierarchy.GetAppenders().FirstOrDefault(x => x.GetType() == typeof(RollingFileAppender) && x.Name == "RollingFile");
if (genericFileAppender != null)
{
genericFileAppender.Threshold = defaultLevel;
genericFileAppender.ActivateOptions();
if (!String.IsNullOrEmpty(instanceName))
{
RollingFileAppender specificFileAppender = (RollingFileAppender)hierarchy.GetAppenders().FirstOrDefault(x => x.GetType() == typeof(RollingFileAppender) && x.Name == "RollingFile_" + instanceName);
if (specificFileAppender == null)
{
RollingFileAppender newFileAppender = new RollingFileAppender();
newFileAppender.Threshold = defaultLevel;
newFileAppender.AppendToFile = genericFileAppender.AppendToFile;
newFileAppender.MaximumFileSize = genericFileAppender.MaximumFileSize;
newFileAppender.MaxFileSize = genericFileAppender.MaxFileSize;
newFileAppender.LockingModel = genericFileAppender.LockingModel;
newFileAppender.Layout = genericFileAppender.Layout;
newFileAppender.Name = String.Format("RollingFile_{0}", instanceName);
newFileAppender.File = genericFileAppender.File.Replace("_log", "_" + instanceName); newFileAppender.ActivateOptions(); ((Logger)log.Logger).AddAppender(newFileAppender);
}
}
}
if (!String.IsNullOrEmpty(instanceName))
{
AdoNetAppender specificDbAppender = (AdoNetAppender)hierarchy.GetAppenders().FirstOrDefault(x => x.GetType() == typeof(AdoNetAppender) && x.Name == "AdoNetAppender_" + instanceName);
if (specificDbAppender == null)
{
AdoNetAppender newAdoNetAppender = new AdoNetAppender();
newAdoNetAppender.ConnectionType = "Foo";
newAdoNetAppender.CommandText = "Foo";
newAdoNetAppender.Name = String.Format("AdoNetAppender_{0}", instanceName);
newAdoNetAppender.AddParameter(new AdoNetAppenderParameter
{
ParameterName = "@log_date",
DbType = DbType.DateTime,
Layout = new RawTimeStampLayout()
});
// add other parameters
newAdoNetAppender.ConnectionString = ConfigurationManager.ConnectionStrings[Settings.Default.ConnectionStringBaseKey + instanceName].ConnectionString;
newAdoNetAppender.ActivateOptions();
hierarchy.Root.AddAppender(newAdoNetAppender);
}
}
}
}编辑:我必须添加,如果我运行这个代码两次,第二次它将日志忽略过滤器。
发布于 2018-10-16 13:45:43
最后我发现:
hierarchy.Root.AddAppender(newFileAppender);是最好的解决方案,但只适用于MinimalLock,因此:
newFileAppender.LockingModel = new FileAppender.MinimalLock();https://stackoverflow.com/questions/52830955
复制相似问题