[英]log4net - logging to database table
I'm using Log4net in ASP.Net MVC for logging to different output types (file & DB). 我在ASP.Net MVC中使用Log4net记录到不同的输出类型(文件和数据库)。 I'm able to log data to RollingFileAppender
but not to AdoNetAppender
我能够将数据记录到RollingFileAppender
但不能记录到AdoNetAppender
Added new log4net.config to project with file-appender section
& DBLog-appender section
将新的log4net.config添加到带有file-appender section
和DBLog-appender section
<log4net>
<root>
<level value="ALL" />
<appender-ref ref="file" />
<appender-ref ref="DBLog" />
</root>
<!--Rolling File Appender-->
<appender name="file" type="log4net.Appender.RollingFileAppender">
<file value="C:\Trinadh\Dot.Net\Web Applications\ASP.NetMVC\PartialViewApplSol\PartialViewApplSol\myapp.log" />
<appendToFile value="true" />
<rollingStyle value="Size" />
<maxSizeRollBackups value="5" />
<maximumFileSize value="5MB" />
<staticLogFileName value="true" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%-7p%d{yyyy-MM-dd HH:mm:ss tt} –%X{user}– %m method:%method %n stacktrace:%stacktrace{5} %n %logger %n type:%type %n line: %line %n" />
</layout>
</appender>
<!--Database Table Appender-->
<appender name="DBLog" type="log4net.Appender.AdoNetAppender">
<bufferSize value="1" />
<connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<connectionString value="Server=DBServer;Database=DemoDB;integrated security=false;persist security info=True;User ID=sysAdmin;Password=XyzAbc;" />
<commandText value="INSERT INTO dbo.Log4net_Log ([Date],[Level],[Logger],[User],[Message],[Exception])
VALUES (@log_date, @log_level, @logger, @user, @message, @exception)" />
<parameter>
<parameterName value="@log_date" />
<dbType value="DateTime" />
<layout type="log4net.Layout.RawTimeStampLayout" />
</parameter>
<parameter>
<parameterName value="@log_level" />
<dbType value="String" />
<size value="50" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%p" />
</layout>
</parameter>
<parameter>
<parameterName value="@logger" />
<dbType value="String" />
<size value="255" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%c" />
</layout>
</parameter>
<parameter>
<parameterName value="@user" />
<dbType value="String" />
<size value="50" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%X{user}" />
</layout>
</parameter>
<parameter>
<parameterName value="@message" />
<dbType value="String" />
<size value="4000" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%m" />
</layout>
</parameter>
<parameter>
<parameterName value="@exception" />
<dbType value="String" />
<size value="2000" />
<layout type="log4net.Layout.ExceptionLayout" />
</parameter>
</appender>
</log4net>
In 'DBLog' appender section, i'm using connection string of my DB to which logs would be written, but i'm already using same connection string in 'web.config' to fetch data and populate on UI. 在“ DBLog”附加程序部分中,我正在使用要写入日志的数据库连接字符串,但是我已经在“ web.config”中使用相同的连接字符串来获取数据并在UI上进行填充。
Added a new log4netHelper.cs to project 向项目添加了一个新的log4netHelper.cs
public class log4netHelper
{
private static readonly ILog log4Net = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
public log4netHelper()
{
if (HttpContext.Current.User != null && HttpContext.Current.User.Identity.IsAuthenticated)
MDC.Set("user", HttpContext.Current.User.Identity.Name);
}
public static void LogMessage(string message)
{
log4Net.Info(message);
}
public static void LogError(string message, Exception ex)
{
log4Net.Error(message, ex);
}
}
RollingFileAppender
is logging following RollingFileAppender
正在记录以下内容
INFO 2018-07-23 19:27:06 PM –(null)– Index Action End method: LogMessage INFO 2018-07-23 19:27:06 PM –(null)–索引操作结束方法: LogMessage
stacktrace:System.Threading.Tasks.Task.ExecutionContextCallback > System.Threading.Tasks.Task.Execute > System.Threading.Tasks.Task.InnerInvoke > PartialViewApplSol.Controllers.HomeController+<>c.b__3_1 > PartialViewApplSol.App_Start.log4netHelper.LogMessage stacktrace:System.Threading.Tasks.Task.ExecutionContextCallback> System.Threading.Tasks.Task.Execute> System.Threading.Tasks.Task.InnerInvoke> PartialViewApplSol.Controllers.HomeController + <> c.b__3_1> PartialViewApplSol.App_Start.log4netHelper.LogMessage
PartialViewApplSol.App_Start.log4netHelper PartialViewApplSol.App_Start.log4netHelper
type:PartialViewApplSol.App_Start.log4netHelper line: 19 类型:PartialViewApplSol.App_Start.log4netHelper行:19
How to get current caller method which is calling log4net.Message()? 如何获取正在调用log4net.Message()的当前调用方方法? It's always showing method names in 'log4netHelper.cs' (LogMessage/ LogError). 它总是在'log4netHelper.cs'(LogMessage / LogError)中显示方法名称。 MSDN says to use 'System.Runtime.CompilerServices.CallerMemberName' attribute, but how to incorporate this into my logic. MSDN表示使用“ System.Runtime.CompilerServices.CallerMemberName”属性,但如何将其纳入我的逻辑。
Current log4net.config have both RollingFileAppender & AdoNetAppender but only RollingFileAppender is logging data to file, nothing is logged to Database table. 当前的log4net.config同时具有RollingFileAppender和AdoNetAppender,但只有RollingFileAppender会将数据记录到文件中,而没有任何记录到数据库表中。
If the problem is in log4net, you can best enable log4net internal debugging: 如果问题出在log4net中,则最好启用log4net内部调试:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<appSettings>
<add key="log4net.Internal.Debug" value="true"/>
</appSettings>
</configuration>
And write it to file: 并将其写入文件:
<configuration>
...
<system.diagnostics>
<trace autoflush="true">
<listeners>
<add
name="textWriterTraceListener"
type="System.Diagnostics.TextWriterTraceListener"
initializeData="C:\tmp\log4net.txt" />
</listeners>
</trace>
</system.diagnostics>
...
</configuration>
If there is any exception you will find it in the log file. 如果有任何异常,您将在日志文件中找到它。 You already have set the buffersize to 1, that will flush each message directly. 您已经将buffersize设置为1,它将直接刷新每条消息。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.