1、新建console应用项目SendEvaluateDataToProvinceConsole

2、选择SendEvaluateDataToProvinceConsole项目右键 选择 管理NuGet程序包,搜索log4net ,点击安装

3、选择SendEvaluateDataToProvinceConsole项目右键 新建App.config,App.config添加一下内容

<?xml version="1.0" encoding="utf-8"?>
<configuration>
<configSections>
<!-- log4net的定义配置节 -->
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>
</configSections>
<log4net>
<!--日志保存到文件里面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=""/>
<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>
<!--日志输出到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>
<!--日志输出到数据库-->
<appender name="AdoNetAppender" type="log4net.Appender.AdoNetAppender">
<!--数据表创建脚本-->
<!--CREATE TABLE LOG(Id integer primary KEY AUTOINCREMENT,Date datetime NOT NULL,UserId varchar() NOT NULL,UserName varchar() NOT NULL,Message varchar() NOT NULL,Exception varchar() NULL);-->
<!--日志缓存写入条数-->
<!--bufferSize表示批处理的日志事件,可以避免每次日志事件都访问数据库,原本是<bufferSize value="" />一百条才插入-->
<bufferSize value=""/>
<!--日志数据库连接串-->
<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"/>-->
<!--日志数据库脚本-->
<commandText value="INSERT INTO LOG([Date],[UserId],[UserName],[Message],[Exception]) VALUES (@Date,@UserId,@UserName,@Message,@Exception)"/>
<!--日志时间Date -->
<parameter>
<parameterName value="@Date"/>
<dbType value="DateTime"/>
<layout type="log4net.Layout.RawTimeStampLayout"/>
</parameter>
<!--自定义UserId -->
<parameter>
<parameterName value="@UserId"/>
<dbType value="String"/>
<size value=""/>
<layout type="log4net.Layout.PatternLayout"/>
</parameter>
<!--自定义UserName -->
<parameter>
<parameterName value="@UserName"/>
<dbType value="String"/>
<size value=""/>
<layout type="log4net.Layout.PatternLayout"/>
</parameter>
<!--日志信息Message -->
<parameter>
<parameterName value="@Message"/>
<dbType value="String"/>
<size value=""/>
<layout type="log4net.Layout.PatternLayout"/>
</parameter>
<!--异常信息Exception -->
<parameter>
<parameterName value="@Exception"/>
<dbType value="String"/>
<size value=""/>
<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中添加代码

using log4net;
using System;
using System.Reflection; namespace SendEvaluateDataToProvinceConsole
{
class Program
{
/// <summary>
/// 记录日志的日志对象
/// </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();//这一句很重要。。。。。
try
{
Log.Info("123...");
Log.Info("普通日志");
Log.Error("错误日志");
Log.Debug("异常信息");
Log.Fatal("致命错误");
Log.Warn("警告信息"); LogEntity logEntity = new LogEntity
{
//Id= "123",
UserId = "",
UserName = "张三",
Message = "消息西夏熊",
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、运行结果

6、上图运行结果注意有些数据不太对,就是插入的是LogEntity 对象,显示的就是一个对象,而不是对象具体对应的数据

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

分析原因是因为LogEntity 是自定义的对象,log4net并不知道LogEntity 是什么东西,所以我们转换一下,把LogEntity 转换成log4net认识的对象就可以了,其实就是修改显示的log4net模式PatternLayout,

代码如下:

先建MyPatternConverter类,继承log4net的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());
} //通过反射获取传入的日志对象的某个属性的值
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;
}
}
}

再新建MyLayout类,继承log4net的PatternLayout类

using log4net.Layout;

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

上面建好MyPatternConverter类和MyLayout类以后,修改App.config配置文件如下

<?xml version="1.0" encoding="utf-8"?>
<configuration>
<configSections>
<!-- log4net的定义配置节 -->
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>
</configSections>
<log4net>
<!--日志保存到文件里面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=""/>
<param name="MaximumFileSize" value="2MB"/>
<param name="RollingStyle" value="Size"/>
<param name="StaticLogFileName" value="true"/>
<!--<param name="Encoding" value="utf-8" />-->//注释掉,使用下面的自定义转换SendEvaluateDataToProvinceConsole.MyLayout,下面的同理
<layout type="log4net.Layout.PatternLayout">
<param name="ConversionPattern" value="%-5p %d [%c] %m%n"/>
</layout>
</appender>
<!--日志输出到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>
<!--日志输出到数据库-->
<appender name="AdoNetAppender" type="log4net.Appender.AdoNetAppender">
<!--数据表创建脚本-->
<!--CREATE TABLE LOG(Id integer primary KEY AUTOINCREMENT,Date datetime NOT NULL,UserId varchar() NOT NULL,UserName varchar() NOT NULL,Message varchar() NOT NULL,Exception varchar() NULL);-->
<!--日志缓存写入条数-->
<!--bufferSize表示批处理的日志事件,可以避免每次日志事件都访问数据库,原本是<bufferSize value="" />一百条才插入-->
<bufferSize value=""/>
<!--日志数据库连接串-->
<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"/>-->
<!--日志数据库脚本-->
<commandText value="INSERT INTO LOG([Date],[UserId],[UserName],[Message],[Exception]) VALUES (@Date,@UserId,@UserName,@Message,@Exception)"/>
<!--日志时间Date -->
<parameter>
<parameterName value="@Date"/>
<dbType value="DateTime"/>
<layout type="log4net.Layout.RawTimeStampLayout"/>
</parameter>
<!--自定义UserId -->
<parameter>
<parameterName value="@UserId"/>
<dbType value="String"/>
<size value=""/>
<!--<layout type="log4net.Layout.PatternLayout"/>-->
<layout type="SendEvaluateDataToProvinceConsole.MyLayout">
<conversionPattern value="%Property{UserId}" />
</layout>
</parameter>
<!--自定义UserName -->
<parameter>
<parameterName value="@UserName"/>
<dbType value="String"/>
<size value=""/>
<!--<layout type="log4net.Layout.PatternLayout"/>-->
<layout type="SendEvaluateDataToProvinceConsole.MyLayout">
<conversionPattern value="%Property{UserName}" />
</layout>
</parameter>
<!--日志信息Message -->
<parameter>
<parameterName value="@Message"/>
<dbType value="String"/>
<size value=""/>
<!--<layout type="log4net.Layout.PatternLayout"/>-->
<layout type="SendEvaluateDataToProvinceConsole.MyLayout">
<conversionPattern value="%Property{Message}" />
</layout>
</parameter>
<!--异常信息Exception -->
<parameter>
<parameterName value="@Exception"/>
<dbType value="String"/>
<size value=""/>
<!--<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>

在运行的话数据库中的运行结果如下:

log4net 控制台和文件和数据库输出三种方式的更多相关文章

  1. Code First03---CodeFirst根据配置同步到数据库的三种方式

    上一节我们说到使用Fluent API对实体的配置,但是有一个问题了,在业务中我们可以用到的实体很多,那是不是每个都需要这样去配置,这样就造成我们重写的OnModelCreating方法很庞大了.所以 ...

  2. css文件引人的三种方式

    前言 1995年,W3C发布了CSS草案 1996年,W3C正式推出CSS1 1998年,推出CSS2 2001年从CSS3开始,CSS这门语言分割成多个独立的模块,每个模块独立分级,且只包含一小部分 ...

  3. laravel记录笔记Laravel 连接数据库、操作数据库的三种方式

    laravel中提供DB facade(原始查找).查询构造器.Eloquent ORM三种操作数据库方式 1.连接数据库 .env 数据库配置 DB_HOST=localhost dbhost DB ...

  4. JDBC操作数据库的三种方式比较

    JDBC(java Database Connectivity)java数据库连接,是一种用于执行上sql语句的javaAPI,可以为多种关系型数据库提供统一访问接口.我们项目中经常用到的MySQL. ...

  5. PHP连接MySQL数据库的三种方式(mysql、mysqli、pdo)

    PHP与MySQL的连接有三种API接口,分别是:PHP的MySQL扩展 .PHP的mysqli扩展 .PHP数据对象(PDO) ,下面针对以上三种连接方式做下总结,以备在不同场景下选出最优方案. P ...

  6. 用python查看文件是否存在的三种方式

    目录 1.使用os模块 判断文件是否可做读写操作 2.使用Try语句 3. 使用pathlib模块 正文 通常在读写文件之前,需要判断文件或目录是否存在,不然某些处理方法可能会使程序出错.所以最好在做 ...

  7. php连接MySQL数据库的三种方式(mysql/mysqli/pdo)

    引言 PHP与MySQL的连接有三种API接口,分别是:PHP的MySQL扩展 .PHP的mysqli扩展 .PHP数据对象(PDO) ,下面针对以上三种连接方式做下总结,以备在不同场景下选出最优方案 ...

  8. ListView适配器获取布局文件作为View的三种方式

    第一种方法: public View getView(int position, View convertView, ViewGroup parent) { View view = null; if ...

  9. jdbc链接数据库的三种方式

    /** * jdbc连接数据库 * @author APPle * */ public class Demo1 { //连接数据库的URL private String url = "jdb ...

随机推荐

  1. Linux E667 同步失败

    在使用Vim编辑/proc目录下的文件后,保存,显示"E667 同步失败" 原因 因为proc这个目录是一个虚拟文件系统,它放置的数据都是在内存中,本身不占有磁盘空间,所以使用Vi ...

  2. 软工作业 wc-java

    项目要求: 实现一个统计程序,它能正确统计程序文件中的字符数.单词数.行数,以及还具备其他扩展功能,并能够快速地处理多个文件. 具体功能 -c 返回文件字符数 -w 返回词的数目 -l 返回行数 扩展 ...

  3. 机器学习 | 聚类分析总结 & 实战解析

    聚类分析是没有给定划分类别的情况下,根据样本相似度进行样本分组的一种方法,是一种非监督的学习算法.聚类的输入是一组未被标记的样本,聚类根据数据自身的距离或相似度划分为若干组,划分的原则是组内距离最小化 ...

  4. JavaWeb项目目录结构

    今天本来是准备学习spring mvc + mybatis,结果被idea的配置环境卡主了,自己刚刚接触JavaWeb不久,所以浪费了很多时间.最终我回归最简单的servlet & jsp,并 ...

  5. sql 查询某个字段最长的记录

    sql  查询文本字段中值的长度最长的记录 一.函数1.SQL ServerLEN() 函数返回文本字段中值的长度.SELECT LEN(column_name) FROM table_name;2. ...

  6. jQuery知识梳理20190817

    目录 jQuery知识梳理20190817 1. jQuery的特征 2. jQuery的两把利器 2.1 jQuery核心函数 2.2 jQuery核心对象 3. jQuery核心函数详解 4. j ...

  7. GNS3、Wireshark、SecureCRT 环境部署

    本次GNS3环境部署教程基于官方推荐的稳定版1.5.4.初次接触此软件,详细的使用方法不是很清楚,所以以此作为学习记录,仅供参考,后期补充. 软件介绍 GNS3 GNS3是一款具有图形化界面可以运行在 ...

  8. Linux命令——parted

    参考:8 Linux ‘Parted’ Commands to Create, Resize and Rescue Disk Partitions 简介 parted是磁盘分区操作工具,支持多种磁盘分 ...

  9. 24.centos7基础学习与积累-010-上机考核命令练习

    从头开始积累centos7系统运用 大牛博客:https://blog.51cto.com/yangrong/p5 1.创建目录/data/oldboy,并且在该目录下创建文件oldboy.txt,然 ...

  10. Pthon魔术方法(Magic Methods)-可调用对象

    Pthon魔术方法(Magic Methods)-可调用对象 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.可调用对象方法 __call__: 类中定义一个该方法,实例就可以像 ...