• C# 利用log4net 把日志写入到数据库表中


    效果图:

    1:第一步创建SQL表结构

    1.  CREATE TABLE [dbo].[LogDetails] (
    2.  [LogID] int NOT NULL IDENTITY(1,1) ,
    3.  [LogDate] datetime NOT NULL ,
    4.  [LogThread] nvarchar(100) NOT NULL ,
    5.  [LogLevel] nvarchar(200) NOT NULL ,
    6.  [LogLogger] nvarchar(500) NOT NULL ,
    7.  [LogMessage] nvarchar(3000) NOT NULL ,
    8.  [LogActionClick] nvarchar(4000) NULL ,
    9.  [UserName] nvarchar(30) NULL ,
    10.  [UserIP] varchar(20) NULL
    11.  )

    2:创建项目然后下载log4net.dll 在项目中添加引用 http://logging.apache.org/log4net/download_log4net.cgi下载Binaries 下面的

    3:创建 log4net.config

     <?xml version="1.0" encoding="utf-8" ?>

    1. <log4net debug="false">
    2. <!-- name属性指定其名称,type则是log4net.Appender命名空间的一个类的名称,意思是,指定使用哪种介质-->
    3. <appender name="ADONetAppender" type="log4net.Appender.ADONetAppender">
    4. <!--日志缓存写入条数 设置为0时只要有一条就立刻写到数据库-->
    5. <bufferSize value="0" />
    6. <!--日志数据库连接串-->
    7. <connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
    8. <connectionString value="DATABASE=GoodLook;SERVER=xx.xx.140.170;UID=sa;PWD=123456a;Connect Timeout=30;" />
    9. <!--日志数据库脚本-->
    10. <commandText value="INSERT INTO LogDetails ([LogDate],[LogThread],[LogLevel],[LogLogger],[LogActionClick],[LogMessage],[UserName],[UserIP]) VALUES (@log_date, @thread, @log_level, @logger, @ActionsClick, @message,@UserName,@UserIP)" />
    11. <!--日志时间LogDate -->
    12. <parameter>
    13. <parameterName value="@log_date" />
    14. <dbType value="DateTime" />
    15. <layout type="log4net.Layout.RawTimeStampLayout" />
    16. </parameter>
    17. <!--线程号-->
    18. <parameter>
    19. <parameterName value="@thread" />
    20. <dbType value="String" />
    21. <size value="100" />
    22. <layout type="log4net.Layout.PatternLayout">
    23. <conversionPattern value="%t" />
    24. </layout>
    25. </parameter>
    26. <!--日志类型LogLevel -->
    27. <parameter>
    28. <parameterName value="@log_level" />
    29. <dbType value="String" />
    30. <size value="200" />
    31. <layout type="log4net.Layout.PatternLayout">
    32. <conversionPattern value="%p" />
    33. </layout>
    34. </parameter>
    35. <!--日志名称-->
    36. <parameter>
    37. <parameterName value="@logger" />
    38. <dbType value="String" />
    39. <size value="500" />
    40. <layout type="log4net.Layout.PatternLayout">
    41. <conversionPattern value="%logger" />
    42. </layout>
    43. </parameter>
    44. <parameter>
    45. <parameterName value="@message" />
    46. <dbType value="String" />
    47. <size value="3000" />
    48. <layout type="Log4NetApply.MyLayout">
    49. <conversionPattern value="%property{Message}" />
    50. </layout>
    51. </parameter>
    52. <parameter>
    53. <parameterName value="@ActionsClick" />
    54. <dbType value="String" />
    55. <size value="4000" />
    56. <layout type="Log4NetApply.MyLayout" >
    57. <conversionPattern value = "%property{ActionsClick}"/>
    58. </layout>
    59. </parameter>
    60. <!--自定义UserName -->
    61. <parameter>
    62. <parameterName value="@UserName" />
    63. <dbType value="String" />
    64. <size value="30" />
    65. <layout type="Log4NetApply.MyLayout" >
    66. <!--log4net.MDC.Set("UserName", "asdfasdf");
    67. <conversionPattern value = "%X{UserName}"/>-->
    68. <conversionPattern value = "%property{UserName}"/>
    69. </layout>
    70. </parameter>
    71. <parameter>
    72. <parameterName value="@UserIP" />
    73. <dbType value="String" />
    74. <size value="20" />
    75. <layout type="Log4NetApply.MyLayout" >
    76. <conversionPattern value = "%property{UserIP}"/>
    77. </layout>
    78. </parameter>
    79. </appender>
    80. <!-- setup the root category, add the appenders and set the default level -->
    81. <root>
    82. <level value="Warn"/><!-- 定义记录的日志级别-->
    83. <level value="Info"/>
    84. <level value="Debug"/>
    85. <level value="Fine"/>
    86. <appender-ref ref="ADONetAppender" /><!-- 记录到什么介质中-->
    87. </root>
    88. <!-- specify the level for some specific categories -->
    89. <!--//关于上边root到logger这块,如果同时出现,有可能会出现重复插入记录的情况:-->
    90. <!--<logger name="iNotes">
    91. <level value="WARN"/>
    92. <level value="INFO"/>
    93. <level value="DEBUG"/>
    94. <level value="FINE"/>
    95. <appender-ref ref="ADONetAppender"/>
    96. </logger>
    97. <logger name="StellaLogger">
    98. <level value="ALL"/>
    99. <appender-ref ref="AdoNetAppender" />
    100. </logger>-->
    101. <appender name="ReflectionLayout" type="log4net.Appender.RollingFileAppender,log4net">
    102. <!--日志文件路径,按文件大小方式输出时在这里指定文件名,并且前面的日志按天在文件名后自动添加当天日期形成文件-->
    103. <param name="File" value="D:/Log/" />
    104. <!--是否追加到文件-->
    105. <param name="AppendToFile" value="true" />
    106. <!--记录日志写入文件时,不锁定文本文件-->
    107. <!--<lockingModel type="log4net.Appender.FileAppender+MinimalLock" />-->
    108. <!--Unicode编码-->
    109. <!--<Encoding value="UTF-8" />-->
    110. <!--最多产生的日志文件数,value="-1"为不限文件数-->
    111. <!--<param name="MaxSizeRollBackups" value="10" />-->
    112. <!--是否只写到一个文件中-->
    113. <param name="StaticLogFileName" value="false" />
    114. <!--按照何种方式产生多个日志文件(日期[Date],文件大小[Size],混合[Composite])-->
    115. <param name="RollingStyle" value="Composite" />
    116. <!--按日期产生文件夹,文件名[在日期方式与混合方式下使用]-->
    117. <param name="DatePattern" value="yyyy-MM-dd/"ReflectionLayout.log"" />
    118. <!--<param name="DatePattern" value="yyyyMMdd/yyyyMMdd"-TimerServer.log"" />-->
    119. <!--<param name="DatePattern" value="yyyyMMdd/"TimerServer/TimerServer.log"" />-->
    120. <!--每个文件的大小。只在混合方式与文件大小方式下使用,超出大小的在文件名后自动增加1重新命名-->
    121. <param name="maximumFileSize" value="500KB" />
    122. <!--记录的格式。-->
    123. <layout type="TGLog.ExpandLayout2.ReflectionLayout,TGLog">
    124. <param name="ConversionPattern" value="记录时间:%date 线程ID:[%thread] 日志级别:%-5level 记录类:%logger 操作者ID:%property{Operator} 操作类型:%property{Action}%n 当前机器名:%property%n当前机器名及登录用户:%username %n 记录位置:%location%n 消息描述:%property{Message}%n 异常:%exception%n 消息:%message%newline%n%n" />
    125. </layout>
    126. </appender>
    127. </log4net>

    4:在Web.config 里面加 configSections 节点 (CS可直接写在app.config里面,或者都写在一个config里面)

    <configuration>

    <strong> <span style="color:#FF0000;"> <configSections>

    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>

    </configSections>

    <log4net configSource="log4net.config"/></span></strong>

    <system.web>

    <compilation debug="true" targetFramework="4.5" />

    <httpRuntime targetFramework="4.5" />

    </system.web>

    </configuration> 

    5:Properties 属性下面的AssemblyInfo.cs 追加 必须有这个,否则写入不到数据库中

    1. //[assembly: log4net.Config.XmlConfigurator(Watch = true)]
    2. //注意: ConfigFile 可以指定相对路径 和 绝对路径。 eg: /log/xxxx.log 或者 d://log//xxxx.log
    3. [assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.config", ConfigFileExtension = "config", Watch = true)]

    6:添加 Global.asax ,然后在Application_Start 追加 读取配置程序文件

    1.  protected void Application_Start(object sender, EventArgs e)
    2.  {
    3.  //应用程序启动时,自动加载配置log4Net
    4.  XmlConfigurator.Configure();
    5.  }

    7:创建自定义类 LogPublicClass.cs,为了方便写入数据库中 自定义的一些信息

    using log4net.Layout;

    using log4net.Layout.Pattern;
    1. using System;
    2. using System.Collections.Generic;
    3. using System.Linq;
    4. using System.Reflection;
    5. using System.Web;
    6. namespace Log4NetApply
    7. {
    8. /// <summary>
    9. /// 包含了所有的自定字段属性
    10. /// </summary>
    11. public class LogContent
    12. {
    13. public LogContent(string macAddress, string computerName, string actionsclick, string description)
    14. {
    15. UserIP = macAddress;
    16. UserName = computerName;
    17. ActionsClick = actionsclick;
    18. Message = description;
    19. }
    20. /// <summary>
    21. /// 访问IP
    22. /// </summary>
    23. public string UserIP { get; set; }
    24. /// <summary>
    25. /// 系统登陆用户
    26. /// </summary>
    27. public string UserName { get; set; }
    28. /// <summary>
    29. /// 动作事件
    30. /// </summary>
    31. public string ActionsClick { get; set; }
    32. /// <summary>
    33. /// 日志描述信息
    34. /// </summary>
    35. public string Message { get; set; }
    36. }
    37. public class MyLayout : PatternLayout
    38. {
    39. public MyLayout()
    40. {
    41. this.AddConverter("property", typeof(LogInfoPatternConverter));
    42. }
    43. }
    44. public class LogInfoPatternConverter : PatternLayoutConverter
    45. {
    46. protected override void Convert(System.IO.TextWriter writer, log4net.Core.LoggingEvent loggingEvent)
    47. {
    48. if (Option != null)
    49. {
    50. // Write the value for the specified key
    51. WriteObject(writer, loggingEvent.Repository, LookupProperty(Option, loggingEvent));
    52. }
    53. else
    54. {
    55. // Write all the key value pairs
    56. WriteDictionary(writer, loggingEvent.Repository, loggingEvent.GetProperties());
    57. }
    58. }
    59. /// <summary>
    60. /// 通过反射获取传入的日志对象的某个属性的值
    61. /// </summary>
    62. /// <param name="property"></param>
    63. /// <returns></returns>
    64. private object LookupProperty(string property, log4net.Core.LoggingEvent loggingEvent)
    65. {
    66. object propertyValue = string.Empty;
    67. PropertyInfo propertyInfo = loggingEvent.MessageObject.GetType().GetProperty(property);
    68. if (propertyInfo != null)
    69. propertyValue = propertyInfo.GetValue(loggingEvent.MessageObject, null);
    70. return propertyValue;
    71. }
    72. }
    73. }

    8:示例使用

    1.  try
    2.  {
    3.  log.Info(new LogContent("127.0.0.1", "111111", "登陆系统", "登陆成功"));
    4.  var ss = 1 - int.Parse("sss");
    5.  }
    6.  catch(Exception ex)
    7.  {
    8.  log.Error(new LogContent("127.0.0.1", "111111", "登陆系统", ex.Message+":"+ex.StackTrace));
    9.  }
  • 相关阅读:
    VSCode 配置 Python 开发环境
    出现:Microsoft Visual C++ 14.0 is required 的解决方案
    python3 pathlib库中的Path类的使用
    使用 AI 绘制箭头
    Adobe Illustrator 入门 新建 保存图片
    jinja2
    Java 读取和写入文本文件
    Affy包 estrogen包
    GEOquery
    apply() 函数家族介绍
  • 原文地址:https://www.cnblogs.com/xiaohua19920/p/9585247.html
Copyright © 2020-2023  润新知