log4net console and database files and output in three ways

1, a new console application project SendEvaluateDataToProvinceConsole

2, right click and choose Select SendEvaluateDataToProvinceConsole project management NuGet package search log4net, click Install

3. Select the right project SendEvaluateDataToProvinceConsole New App.config, add about content App.config

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <configSections>
    <-! Custom configuration section of log4net ->
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>
  </configSections>
  <log4net>
    <! - save the log to a file inside Log.txt ->
    <appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">
      <param name="File" value="Log\Log.txt"/>
      <param name="AppendToFile" value="true"/>
      <param name="MaxSizeRollBackups" value="100"/>
      <param name="MaximumFileSize" value="2MB"/>
      <param name="RollingStyle" value="Size"/>
      <param name="StaticLogFileName" value="true"/>
      <!--<param name="Encoding" value="utf-8" />-->
      <layout type="log4net.Layout.PatternLayout">
        <param name="ConversionPattern" value="%-5p %d [%c] %m%n"/>
      </layout>
    </appender>
    <! - log output to Console ->
    <appender name="ColoredConsoleAppender" type="log4net.Appender.ColoredConsoleAppender">
      <mapping>
        <level value="ERROR"/>
        <foreColor value="White"/>
        <backColor value="Red,HighIntensity"/>
      </mapping>
      <mapping>
        <level value="DEBUG"/>
        <backColor value="Green"/>
      </mapping>
      <mapping>
        <level value="Info"/>
        <backColor value="Yellow"/>
      </mapping>
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline"/>
      </layout>
      <filter type="log4net.Filter.LevelRangeFilter">
        <param name="LevelMin" value="Debug"/>
        <param name="LevelMax" value="Fatal"/>
      </filter>
    </appender>
    <! - log output to the database ->
    <appender name="AdoNetAppender" type="log4net.Appender.AdoNetAppender">
      <! - Create a data table Script ->
      <!--CREATE TABLE LOG(Id integer primary KEY AUTOINCREMENT,Date datetime NOT NULL,UserId varchar(20) NOT NULL,UserName varchar(50) NOT NULL,Message varchar(4000) NOT NULL,Exception varchar(2000) NULL);-->
      <! - write the number of the log cache ->
      <-! BufferSize represent the batch log events, log events are avoided each access to the database, originally <bufferSize value = one hundred "100" /> only Insert ->
      <bufferSize value="1"/>
      <! - log database connection string ->
      <connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
      <connectionString value="DATABASE=EvMS;SERVER=192.168.1.234;UID=evms;PWD=123456;Connect Timeout=15;" />
      <!--System.Data.SQLite, Version=1.0.65.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139-->
      <!--<connectionType value="System.Data.SQLite.SQLiteConnection, System.Data, Version=1.0.65.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139"/>-->
      <!--<connectionString value="Data source=F:\Person\Longteng\LongtengSln\SendEvaluateDataToProvinceConsole\Data\mysqlite.db;Connect Timeout=15"/>-->
      <-! Log database script ->
      <commandText value="INSERT INTO LOG([Date],[UserId],[UserName],[Message],[Exception]) VALUES (@Date,@UserId,@UserName,@Message,@Exception)"/>
      <-! Log Time Date ->
      <parameter>
        <parameterName value="@Date"/>
        <dbType value="DateTime"/>
        <layout type="log4net.Layout.RawTimeStampLayout"/>
      </parameter>
      <-! Custom UserId ->
      <parameter>
        <parameterName value="@UserId"/>
        <dbType value="String"/>
        <size value="20"/>
        <layout type="log4net.Layout.PatternLayout"/>
      </parameter>
      <-! Custom UserName ->
      <parameter>
        <parameterName value="@UserName"/>
        <dbType value="String"/>
        <size value="50"/>
        <layout type="log4net.Layout.PatternLayout"/>
      </parameter>
      <-! Log Information Message ->
      <parameter>
        <parameterName value="@Message"/>
        <dbType value="String"/>
        <size value="4000"/>
        <layout type="log4net.Layout.PatternLayout"/>
      </parameter>
      <! - exception information Exception ->
      <parameter>
        <parameterName value="@Exception"/>
        <dbType value="String"/>
        <size value="2000"/>
        <layout type="log4net.Layout.PatternLayout"/>
      </parameter>
    </appender>
    <root>
      <level value="all"/>
      <appender-ref ref="RollingLogFileAppender"/>
      <appender-ref ref="ColoredConsoleAppender"/>
      <appender-ref ref="AdoNetAppender"/>
    </root>
  </log4net>
  <startup>
    <supportedRuntime version="v2.0.50727"/>
  </startup>
</configuration>

4, Program.cs add code

using log4net;
using System;
using System.Reflection;

namespace SendEvaluateDataToProvinceConsole
{
    class Program
    {
        /// <summary>
        /// logging log objects
        /// </summary>
        public static ILog Log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
        static void Main(string[] args)
        {
            //log4net.Config.XmlConfigurator.ConfigureAndWatch(new System.IO.FileInfo(@"F:\Person\Longteng\LongtengSln\SendEvaluateDataToProvince\App.config"));
            log4net.Config.XmlConfigurator.Configure (); // This is something very important. . . . .
            try
            {
                Log.Info("123...");
                Log.Info ( "Ordinary log");
                Log.Error ( "Error Log");
                Log.Debug ( "anomalies");
                Log.Fatal ( "Fatal Error");
                Log.Warn ( "warnings");
                
                LogEntity logEntity = new LogEntity
                  {
                    //Id= "123",
                    UserId = "123",
                    UserName = "Joe Smith"
                    Message = "Message of the Western Xia Xiong"
                    Exception = "Exception"
                    };
 
                   Log.Debug(logEntity);
                   Console.Read();
            }
            catch (Exception e)
            {
                Console.WriteLine(e.Message);
                Console.WriteLine(e.Source);
                Console.WriteLine(e.StackTrace);
                Console.WriteLine(e.InnerException != null ? e.InnerException.ToString() : "");
                Console.ReadLine();
            }
        }        
    }
}

 

5, operating results

 

 

6, the operation result of FIG. Note that some data is not right, the object is inserted LogEntity is, an object is displayed instead of the specific data corresponding to the object

LogEntity logEntity = new LogEntity
{
//Id= "123",
UserId = "123",
UserName = "张三",
Message = "消息西夏熊",
Exception = "Exception"
};

Analyze the reasons is because LogEntity is custom objects, log4net LogEntity not know what it is, so we converted it to convert into objects LogEntity log4net know, can, in fact, is to modify the log4net PatternLayout display mode,

code show as below:

First built MyPatternConverter classes, inheritance log4net class of PatternLayoutConverter

using log4net.Core;
using log4net.Layout.Pattern;
using System.IO;
using System.Reflection;

namespace SendEvaluateDataToProvinceConsole
{
    public class MyPatternConverter : PatternLayoutConverter
    {
        protected override void Convert(TextWriter writer, LoggingEvent loggingEvent)
        {
            if (Option != null)
                WriteObject(writer, loggingEvent.Repository, LookupProperty(Option, loggingEvent));
            else
                WriteDictionary(writer, loggingEvent.Repository, loggingEvent.GetProperties());
        }

        // Get the value of the incoming log object through the reflection of a property
        private object LookupProperty(string property, log4net.Core.LoggingEvent loggingEvent)
        {
            object propertyvalue = string.Empty;
            PropertyInfo propertyInfo = loggingEvent.MessageObject.GetType().GetProperty(property);

            if (propertyInfo != null)
                propertyvalue = propertyInfo.GetValue(loggingEvent.MessageObject, null);
            return propertyvalue;
        }
    }
}

 

Then the new MyLayout classes, inheritance log4net class of PatternLayout

using log4net.Layout;

namespace SendEvaluateDataToProvinceConsole
{
    public class MyLayout : PatternLayout
    {
        public MyLayout()
        {
            this.AddConverter("Property", typeof(MyPatternConverter));
        }
    }
}

After the above classes and built MyPatternConverter MyLayout class, modify the configuration file as follows App.config

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <configSections>
    <-! Custom configuration section of log4net ->
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>
  </configSections>
  <log4net>
    <! - save the log to a file inside Log.txt ->
    <appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">
      <param name="File" value="Log\Log.txt"/>
      <param name="AppendToFile" value="true"/>
      <param name="MaxSizeRollBackups" value="100"/>
      <param name="MaximumFileSize" value="2MB"/>
      <param name="RollingStyle" value="Size"/>
      <param name="StaticLogFileName" value="true"/>
      <-! <Param name = "Encoding" value = "utf-8" /> -> // comment out, using the following conversion custom SendEvaluateDataToProvinceConsole.MyLayout, following empathy
      <layout type="log4net.Layout.PatternLayout">
        <param name="ConversionPattern" value="%-5p %d [%c] %m%n"/>
      </layout>
    </appender>
    <! - log output to Console ->
    <appender name="ColoredConsoleAppender" type="log4net.Appender.ColoredConsoleAppender">
      <mapping>
        <level value="ERROR"/>
        <foreColor value="White"/>
        <backColor value="Red,HighIntensity"/>
      </mapping>
      <mapping>
        <level value="DEBUG"/>
        <backColor value="Green"/>
      </mapping>
      <mapping>
        <level value="Info"/>
        <backColor value="Yellow"/>
      </mapping>
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline"/>
      </layout>
      <filter type="log4net.Filter.LevelRangeFilter">
        <param name="LevelMin" value="Debug"/>
        <param name="LevelMax" value="Fatal"/>
      </filter>
    </appender>
    <! - log output to the database ->
    <appender name="AdoNetAppender" type="log4net.Appender.AdoNetAppender">
      <! - Create a data table Script ->
      <!--CREATE TABLE LOG(Id integer primary KEY AUTOINCREMENT,Date datetime NOT NULL,UserId varchar(20) NOT NULL,UserName varchar(50) NOT NULL,Message varchar(4000) NOT NULL,Exception varchar(2000) NULL);-->
      <! - write the number of the log cache ->
      <-! BufferSize represent the batch log events, log events are avoided each access to the database, originally <bufferSize value = one hundred "100" /> only Insert ->
      <bufferSize value="1"/>
      <! - log database connection string ->
      <connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
      <connectionString value="DATABASE=EvMS;SERVER=192.168.1.234;UID=evms;PWD=123456;Connect Timeout=15;" />
      <!--System.Data.SQLite, Version=1.0.65.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139-->
      <!--<connectionType value="System.Data.SQLite.SQLiteConnection, System.Data, Version=1.0.65.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139"/>-->
      <!--<connectionString value="Data source=F:\Person\Longteng\LongtengSln\SendEvaluateDataToProvinceConsole\Data\mysqlite.db;Connect Timeout=15"/>-->
      <-! Log database script ->
      <commandText value="INSERT INTO LOG([Date],[UserId],[UserName],[Message],[Exception]) VALUES (@Date,@UserId,@UserName,@Message,@Exception)"/>
      <-! Log Time Date ->
      <parameter>
        <parameterName value="@Date"/>
        <dbType value="DateTime"/>
        <layout type="log4net.Layout.RawTimeStampLayout"/>
      </parameter>
      <-! Custom UserId ->
      <parameter>
        <parameterName value="@UserId"/>
        <dbType value="String"/>
        <size value="20"/>
        <!--<layout type="log4net.Layout.PatternLayout"/>-->
        <layout type="SendEvaluateDataToProvinceConsole.MyLayout">
          <conversionPattern value="%Property{UserId}" />
        </layout>
      </parameter>
      <-! Custom UserName ->
      <parameter>
        <parameterName value="@UserName"/>
        <dbType value="String"/>
        <size value="50"/>
        <!--<layout type="log4net.Layout.PatternLayout"/>-->
        <layout type="SendEvaluateDataToProvinceConsole.MyLayout">
          <conversionPattern value="%Property{UserName}" />
        </layout>
      </parameter>
      <-! Log Information Message ->
      <parameter>
        <parameterName value="@Message"/>
        <dbType value="String"/>
        <size value="4000"/>
        <!--<layout type="log4net.Layout.PatternLayout"/>-->
        <layout type="SendEvaluateDataToProvinceConsole.MyLayout">
          <conversionPattern value="%Property{Message}" />
        </layout>
      </parameter>
      <! - exception information Exception ->
      <parameter>
        <parameterName value="@Exception"/>
        <dbType value="String"/>
        <size value="2000"/>
        <!--<layout type="log4net.Layout.PatternLayout"/>-->
        <!--<layout type="log4net.Layout.ExceptionLayout" />-->
        <layout type="SendEvaluateDataToProvinceConsole.MyLayout">
          <conversionPattern value="%Property{Exception}" />
        </layout>
      </parameter>
    </appender>
    <root>
      <level value="all"/>
      <appender-ref ref="RollingLogFileAppender"/>
      <appender-ref ref="ColoredConsoleAppender"/>
      <appender-ref ref="AdoNetAppender"/>
    </root>
  </log4net>
  <startup>
    <supportedRuntime version="v2.0.50727"/>
  </startup>
</configuration>

 

 In the run, then run the results in a database as follows:

 

 

Published 357 original articles · won praise 35 · views 280 000 +

Guess you like

Origin blog.csdn.net/LongtengGensSupreme/article/details/103389169