log4net.config
<?xml version="1.0" encoding="utf-8"?> <configuration> <configSections> <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" /> </configSections> <log4net> <appender name="ADONetAppender" type="log4net.Appender.ADONetAppender"> <bufferSize value="1" /> <connectionType value="MySql.Data.MySqlClient.MySqlConnection, MySql.Data, Version=8.0.11.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d" /> <connectionString value="server=120.78.75.199;port=3306;database=logtest;uid=root;password=4511027;SslMode = None" /> <commandText value="INSERT INTO log(Log_DateTime,Log_Thread,Log_Level,Log_Logger,Log_Message) VALUES(@log_datetime, @log_thread , @log_level, @log_logger, @log_message)" /> <logger name="iNotes"> <appender-ref ref="ADONetAppender" /> <level value="ALL"/> </logger> <param name="Parameter"> <param name="ParameterName" value="@log_datetime" /> <param name="DbType" value="DateTime" /> <param name="Layout" type="test.MyLaout"> <param name="ConversionPattern" value="%log_datetime" /> </param> </param> <param name="Parameter"> <param name="ParameterName" value="@log_thread" /> <param name="DbType" value="String" /> <param name="Size" value="255" /> <param name="Layout" type="test.MyLaout"> <param name="ConversionPattern" value="%log_thread" /> </param> </param> <param name="Parameter"> <param name="ParameterName" value="@log_level" /> <param name="DbType" value="String" /> <param name="Size" value="50" /> <param name="Layout" type="test.MyLaout"> <param name="ConversionPattern" value="%log_level" /> </param> </param> <param name="Parameter"> <param name="ParameterName" value="@log_logger" /> <param name="DbType" value="String" /> <param name="Size" value="255" /> <param name="Layout" type="test.MyLaout"> <param name="ConversionPattern" value="%log_logger" /> </param> </param> <param name="Parameter"> <param name="ParameterName" value="@log_message" /> <param name="DbType" value="String" /> <param name="Size" value="255" /> <param name="Layout" type="test.MyLaout"> <param name="ConversionPattern" value="%log_message" /> </param> </param> </appender> <root> <level value="ALL" /> <appender-ref ref="ADONetAppender" /> <appender-ref ref="LogFileAppender"/> </root> </log4net> <system.web> <compilation debug="true" targetFramework="4.6.1" /> <httpRuntime targetFramework="4.6.1" /> </system.web> </configuration>
Log.cs
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.SessionState; namespace test { public class Log { public DateTime Log_DateTime { get; set; } public string Log_Thread { get; set; } public string Log_Level { get; set; } public string Log_Logger { get; set; } public string Log_Message { get; set; } public Log( DateTime log_DateTime,string log_Thread, string log_Level,string log_Logger,string log_Message) { Log_DateTime = log_DateTime; Log_Thread = log_Thread; Log_Level = log_Level; Log_Logger = log_Logger; Log_Message = log_Message; } } }
MyLayout.cs
namespace test { public class MyLayout : PatternLayout { public MyLayout() { this.AddConverter("log_datetime", typeof(ParamterContent.Log_DateTimeParam)); this.AddConverter("log_thread", typeof(ParamterContent.Log_ThreadParam)); this.AddConverter("log_level", typeof(ParamterContent.Log_LevelParam)); this.AddConverter("log_logger", typeof(ParamterContent.Log_LoggerParam)); this.AddConverter("log_message", typeof(ParamterContent.Log_MessageParam)); } } }
ParamterContent.cs
internal sealed class Log_DateTimeParam : PatternLayoutConverter { // Methods protected override void Convert(TextWriter writer, LoggingEvent loggingEvent) { Log content = loggingEvent.MessageObject as Log; if (content != null) { writer.Write(content.Log_DateTime); } } } internal sealed class Log_ThreadParam : PatternLayoutConverter { protected override void Convert(TextWriter writer, LoggingEvent loggingEvent) { Log content = loggingEvent.MessageObject as Log; if (content != null) { writer.Write(content.Log_Thread); } } } internal sealed class Log_LevelParam : PatternLayoutConverter { protected override void Convert(TextWriter writer, LoggingEvent loggingEvent) { Log content = loggingEvent.MessageObject as Log; if (content != null) { writer.Write(content.Log_Level); } } } internal sealed class Log_LoggerParam : PatternLayoutConverter { protected override void Convert(TextWriter writer, LoggingEvent loggingEvent) { Log content = loggingEvent.MessageObject as Log; if (content != null) { writer.Write(content.Log_Logger); } } } internal sealed class Log_MessageParam : PatternLayoutConverter { protected override void Convert(TextWriter writer, LoggingEvent loggingEvent) { Log content = loggingEvent.MessageObject as Log; if (content != null) { writer.Write(content.Log_Message); } } }
HomeController.cs
public ActionResult Index() { DateTime time = DateTime.Now; log4net.ILog loger = log4net.LogManager.GetLogger("iNotes"); test.Log msg = new Log(time, "1", "2", "3", "hhhhh"); loger.Info(msg); return View(); }
不知道哪里出了问题,数据库连接正常,sql语句也可以执行
自带的字段能记录到吗?
如果不能,检查一下AssemblyInfo.cs文件有没有关于log4net的配置:
[assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.config", Watch = true)];
如果能,检查自定义的Layout类所在程序集是否跟项目程序集一致,不一致的话,需要在配置文件显式指定所在的程序集名:
<param name="Parameter"> <param name="ParameterName" value="@log_level" /> <param name="DbType" value="String" /> <param name="Size" value="50" /> <param name="Layout" type="test.MyLaout,程序集名称"> <param name="ConversionPattern" value="%log_level" /> </param> </param>
@沃尔德: 之前自带的字段是可以插到数据库的,改成自定义字段就不行了,assemblyInfo里也加了那行,程序集也是一致的