我发现了类似的问题,但答案没有。
Log4Net在日志数据库中没有写任何内容,我真的不知道如何找到错误。
这是我的配置文件:
<log4net>
<appender name="AdoNetAppender" type="log4net.Appender.AdoNetAppender">
<bufferSize value="100" />
<connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<connectionString value="data source=sqlServer;initial catalog=Logging;integrated security=false;persist security info=True;User ID=logUser;Password=logPassword" />
<commandText value="INSERT INTO dbo.myLogTable ([Date],[Thread],[Level],[Logger],[Message],[Exception]) VALUES (@log_date, @thread, @log_level, @logger, @message, @exception)" />
<parameter>
<parameterName value="@log_date" />
<dbType value="DateTime" />
<layout type="log4net.Layout.RawTimeStampLayout" />
</parameter>
<parameter>
<parameterName value="@thread" />
<dbType value="String" />
<size value="255" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%thread" />
</layout>
</parameter>
<parameter>
<parameterName value="@log_level" />
<dbType value="String" />
<size value="50" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%level" />
</layout>
</parameter>
<parameter>
<parameterName value="@logger" />
<dbType value="String" />
<size value="255" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%logger" />
</layout>
</parameter>
<parameter>
<parameterName value="@message" />
<dbType value="String" />
<size value="4000" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%message" />
</layout>
</parameter>
<parameter>
<parameterName value="@exception" />
<dbType value="String" />
<size value="2000" />
<layout type="log4net.Layout.ExceptionLayout" />
</parameter>
</appender>
</log4net>
它实际上是SQL Server example on the apache page的完整副本。我只更改了连接字符串。连接本身应该可以正常工作,我已经使用SqlConnection
测试了连接字符串。
这是我创建日志记录对象并加载配置的方法:
public static class LogFactory
{
public const string Log4NetConfig = "log4net.config";
public static ILog GetLogger()
{
var uri = new Uri(Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().CodeBase), Log4NetConfig));
var configFile = new FileInfo(Path.GetFullPath(uri.LocalPath));
XmlConfigurator.ConfigureAndWatch(configFile);
ILog log = LogManager.GetLogger(typeof(LogFactory));
return log;
}
}
记录本身:
private static readonly ILog Log = LogFactory.GetLogger();
[...]
Log.Info("Test 123");
如果我用通常的“log to file”配置替换配置,则日志工作正常,所以我猜错误必须在配置中的某处,但是配置是主页的默认示例。
你能在某个地方看到错误吗?
答案 0 :(得分:4)
您没有定义何时应该使用appender
,也没有定义bufferSize
您推迟写入数据库。
<log4net>
<root>
<level value="ALL" /> <!--send all logs to appenders-->
<appender-ref ref="AdoNetAppender" />
</root>
<appender name="AdoNetAppender" type="log4net.Appender.AdoNetAppender">
<bufferSize value="100" /> <!--THIS WILL POSTPONE DB WRITING UNTIL A BUFFER OF 100 LOG IS REACHED-->
<threshold value="INFO"/> <!--log when >= INFO -->
.....
</appender>
</log4net>
最后的想法:
每次需要记录器时,您都在调用log4net配置程序,而这不是您应该如何操作的。 它应该仅在您启动应用程序(静态主方法)或网站(global.asax applicationStart)时第一次调用。
然后你的类应该有readonly ILog属性:
private static ILog logger = LogManager.GetLogger(typeof(MyClass));
答案 1 :(得分:3)
<bufferSize value="100" />
这意味着Log4Net在插入数据库之前会在内存中保留100条记录。
这是设计用于限制数据库的往返。尝试设置<bufferSize value="1" />
或者0可能有效。
答案 2 :(得分:0)
使用AdoNetAppender时,我无法将日志详细信息写入数据库。 以下是为使其成为可行解决方案所做的更改: 1)使用bufferSize值=&#34; 1&#34;或bufferSize值=&#34; 0&#34; 2)&#39; root&#39;目录应该在所有使用过的Appender之前使用
EG。
<root>
<level value="ALL"></level>
<appender-ref ref="AdoNetAppender"></appender-ref>
<appender-ref ref="RollingFileAppender"></appender-ref>
</root>
<appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender">
<file value="mylogfile.txt" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date [%thread] %level %logger - %message%newline" />
</layout>
</appender>
<appender name="AdoNetAppender" type="log4net.Appender.AdoNetAppender">
<bufferSize value="1" />
<connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"/>
<connectionString value="data source=server_name; initial catalog=database_name;integrated security=false; persist security info=True;User ID=user_id;Password=password" />
<commandText value="INSERT INTO ErrorLog ([Logger]) VALUES (@logger)" />
<parameter>
<parameterName value="@logger" />
<dbType value="String" />
<size value="100" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%logger" />
</layout>
</parameter>
</appender>
</log4net>