log4net插入access自定義字段

1.建立表格數據庫

2.建立log4net.xml,並設置屬性始終複製,關鍵屬性app

 <bufferSize value="1" />
 <conversionPattern value="%property{usernm}" />

|DataDirectory| 若是是winform,在項目下加個文件夾App_Data而後將access數據庫放進去。
在程序運行開始加上這個方法:
 string p = AppDomain.CurrentDomain.BaseDirectory;
            if (p.IndexOf("\\bin\\") > 0)
            {
                if (p.EndsWith("\\bin\\Debug\\"))
                    p = p.Replace("\\bin\\Debug", "");
                if (p.EndsWith("\\bin\\Release\\"))
                    p = p.Replace("\\bin\\Release", "");
            }
            if (!p.EndsWith("App_Data\\"))
                p = p + "App_Data\\";
            AppDomain.CurrentDomain.SetData("DataDirectory", p);
<?xml version="1.0" encoding="utf-8" ?> 
<configuration>
  <configSections>
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net"/>
  </configSections>
  <!--站點日誌配置部分-->
  <log4net>
    <root>
      <!--控制級別,由低到高: ALL|DEBUG|INFO|WARN|ERROR|FATAL|OFF-->
      <!--好比定義級別爲INFO,則INFO級別向下的級別,好比DEBUG日誌將不會被記錄-->
      <!--若是沒有定義LEVEL的值,則缺省爲DEBUG-->
      <level value="ALL"/>
      <appender-ref ref="RollingFileAppender"/>
    </root>
    <appender name="AdoNetAppender_Access" type="log4net.Appender.AdoNetAppender">
      <bufferSize value="1" />
      <connectionString value=" Provider=Microsoft.ACE.OLEDB.12.0;Data Source=|DataDirectory|\site.accdb;Persist Security Info=False;" />
      <commandText value="INSERT INTO tbLog ([Date],[Thread],[Level],[Logger],[Message],[usernm]) VALUES (@log_date, @thread, @log_level, @logger, @message,@usernm)" />
      <parameter>
        <parameterName value="@log_date" />
        <dbType value="String" />
        <size value="255" />
        <layout type="log4net.Layout.PatternLayout">
          <conversionPattern value="%date" />
        </layout>
      </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="1024" />
        <layout type="log4net.Layout.PatternLayout">
          <conversionPattern value="%message" />
        </layout>
      </parameter>
      <parameter>
        <parameterName value="@usernm" />
        <dbType value="String" />
        <size value="1024" />
        <layout type="log4net.Layout.PatternLayout">
          <conversionPattern value="%property{usernm}" />
        </layout>
      </parameter>
    </appender>
    <logger name="FCore" additivity="true">
      <appender-ref ref="AdoNetAppender_Access" />
      <level value="ALL" />
    </logger>
  </log4net>
</configuration>

3.建立log4net幫助ide

  class LogHelper
    {
        /// <summary>
        /// lock對象
        /// </summary>
        private static object lockLog = new object();

        static string _logpath;
        private static string LogPath
        {
            get
            {
                if (_logpath == null)
                    _logpath = AppDomain.CurrentDomain.BaseDirectory + "\\Log4net.xml";
                return _logpath;
            }
        }
        private static ILog _log;
        /// <summary>
        /// 記錄Log信息
        /// </summary>
        public static ILog ToLog
        {
            get
            {
                if (_log == null)
                {
                    lock (lockLog)
                    {
                        System.IO.FileInfo file = new System.IO.FileInfo(LogPath);
                        log4net.Config.XmlConfigurator.ConfigureAndWatch(file);
                        //log4net.Config.XmlConfigurator.Configure(file);
                        _log = log4net.LogManager.GetLogger("FCore");
                        GlobalContext.Properties["usernm"] = "用戶名"; 
                    }
                }
                return _log;
            }
        }
    }

    /// <summary>
    /// Log對外執行文件
    /// </summary>
    public class Log
    {
        /// <summary>
        /// 記錄Error日誌
        /// </summary>
        /// <param name="msg"></param>
        public static void Error(string msg)
        {
            LogHelper.ToLog.Error(msg);
        }
        /// <summary>
        /// 記錄Warn日誌
        /// </summary>
        /// <param name="msg"></param>
        public static void Warn(string msg)
        {
            LogHelper.ToLog.Warn(msg);
        }
        /// <summary>
        /// 記錄Info日誌
        /// </summary>
        /// <param name="msg"></param>
        public static void Info(string msg)
        {
            LogHelper.ToLog.Info(msg);
        }
        /// <summary>
        /// 記錄Debug日誌
        /// </summary>
        /// <param name="msg"></param>
        public static void Debug(string msg)
        {
            LogHelper.ToLog.Debug(msg);
        }
    }

4.調用spa

 Log.Info(MethodBase.GetCurrentMethod().DeclaringType.ToString() + ":" + GetMethodName());

  public static string GetMethodName()
        {
            var method = new StackFrame(1).GetMethod(); // 這裏忽略1層堆棧,也就忽略了當前方法GetMethodName,這樣拿到的就正好是外部調用GetMethodName的方法信息
            var property = (
                      from p in method.DeclaringType.GetProperties(
                               BindingFlags.Instance |
                               BindingFlags.Static |
                               BindingFlags.Public |
                               BindingFlags.NonPublic)
                      where p.GetGetMethod(true) == method || p.GetSetMethod(true) == method
                      select p).FirstOrDefault();
            return property == null ? method.Name : property.Name;
        }

另外一種寫入本地線程

<?xml version="1.0" encoding="utf-8" ?> 
<configuration>
  <configSections>
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net"/>
  </configSections>
  <!--站點日誌配置部分-->
  <log4net>
    <root>
      <!--控制級別,由低到高: ALL|DEBUG|INFO|WARN|ERROR|FATAL|OFF-->
      <!--好比定義級別爲INFO,則INFO級別向下的級別,好比DEBUG日誌將不會被記錄-->
      <!--若是沒有定義LEVEL的值,則缺省爲DEBUG-->
      <level value="ALL"/>
      <appender-ref ref="RollingFileAppender"/>
    </root>
    <appender name="DateAppender" type="log4net.Appender.RollingFileAppender">
      <bufferSize value="100" />
      <file value="C:\log\" />
      <appendToFile value="true" />
      <rollingStyle value="Date" />
      <staticLogFileName value="false" />
      <datePattern value="yyyyMMdd&quot;.log&quot;" />
      <!--<param name="StaticLogFileName" value="false"/>-->
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="時間:%date/線程:[%thread]/level:%-5level/logger:%logger/property:[%property{NDC}]/method:%method/毫秒:%r/信息:%message%newline" />
      </layout>
    </appender>
    <logger name="FCore" additivity="true">
      <appender-ref ref="DateAppender" />
      <level value="INFO" />
    </logger>
  </log4net>
</configuration>
View Code
相關文章
相關標籤/搜索