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".log"" /> <!--<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>