1.添加应用log4net.dll

2.新增log4net.config文件,文件内容如下

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<log4net>
<root>
<level value="ALL" />
<appender-ref ref="LogFileAppender" />
</root>
<appender name="LogFileAppender" type="log4net.Appender.RollingFileAppender" >
<param name="File" value="Log.txt" />
<param name="AppendToFile" value="false" />
<layout type="log4net.Layout.PatternLayout">
<!--<param name="ConversionPattern" value="%d [%t] %-5p %c [%x] &lt;%X{auth}&gt;%n - %m%n" />-->
<!--<param name="Header" value="/************************ Start ********************************/" />
<param name="Footer" value="/************************ End ********************************/" />-->
<param name="ConversionPattern" value="/************************ Start ********************************/%n发生时间:%d %n事件级别:%level %n相关类名:%c%n程序文件:%F 第%L行%n日志内容:%m%n%n" />
</layout>
</appender>
<logger name ="MyLogger">
<level value="ERROR"></level>
<appender-ref ref="LogFileAppender"></appender-ref>
</logger>
</log4net>
</configuration>

3.修改文件AssemblyInfo.cs,在文件的最后添加以下内容

[assembly: log4net.Config.DOMConfigurator(ConfigFile = "log4net.config", Watch = true)]

4.方法调用

     private static log4net.ILog log = null;private static object lockHelper = new object();
public static log4net.ILog Log
{
get
{
if (log == null)
{
lock (lockHelper)
{
log = log4net.LogManager.GetLogger("MyLogger");
}
}
return log;
}
}public static void LogInfo(string msg)
{
Log.Error(msg);
}

5.查看log文件以确认log正常写入了

如何防止自定义的logger和root重复写入日志

logger是从root继承而来,默认的用logger写的日志会被root重复写一份,如何防止这种情况呢。

其实log4net提供了一种很好的解决方式,断开logger与root的继承关系,只要在配置文件里的logger加上属性additivity="false" 就可以了。

<logger name ="MyLogger" additivity="false" >
<level value="Info"></level>
<appender-ref ref="LogFileAppender"></appender-ref>
</logger>

注:在winform中可能会遇到“缺少log4net引用”的错误,这个其实很简单。选择项目属性进入如下图所示的界面,

然后将目标框架选择为“非客户端配置”在本图片中为黄色高亮的,客户端配置的为精简版的,有许多组件不包含其中的,然后保存成功即可。

cmd中启动exe 方法:

C:\Users>start D:\项目\HSR\trunk\src\HSRailwayStores20111128\PosCloseDate4\bin\Debug\PosCloseDate4.exe  20140331

程序中调用方法:

/********* 调用STLD解析,生成小票程序 Start ********/
Process oCallPosCloseDate4Process = new Process();
ProcessStartInfo startInfo = new ProcessStartInfo();
startInfo.FileName = "PosCloseDate4.exe " + strbussinessDay;
oCallPosCloseDate4Process.StartInfo.UseShellExecute = false;
oCallPosCloseDate4Process.StartInfo.RedirectStandardOutput = true;
oCallPosCloseDate4Process.StartInfo = startInfo;
oCallPosCloseDate4Process.Start();

oCallPosCloseDate4Process.WaitForExit();
/********* 调用STLD解析,生成小票程序 End ********/

怎样让控制台程序在运行时不显示dos界面?

处理方法:打开【项目属性】,找到【输出类型】,改为【windows应用程序】

winform 下log4net简单应用示例及“缺少log4net引用”的处理方案的更多相关文章

  1. C# Winform下一个热插拔的MIS/MRP/ERP框架(多语言方案)

    个别时候,我们需要一种多语种切换方案. 我的方案是这样的: 1.使用文本文本存储多语言元素,应用程序启动时加载到内存表中: 2.应用程序启动时从配置文件加载语种定义: 3.所有窗体继承自一个Base基 ...

  2. ABAP分享四 选择屏幕下拉菜单简单实现示例

    PARAMETERS p_carri2 LIKE spfli-carrid                    AS LISTBOX VISIBLE LENGTH 20                ...

  3. Log4Net日志的简单使用示例

    前言 源码参考示例地址 http://www.51aspx.com/Code/log4netusedemo/2707 本例博客园源码 https://files.cnblogs.com/files/m ...

  4. Winform下CefSharp的引用、配置、实例与报错排除(源码)

    Winform下CefSharp的引用.配置.实例与报错排除 本文详细介绍了CefSharp在vs2013..net4.0环境下,创建Winfrom项目.引用CefSharp的方法,演示了winfro ...

  5. 分享在winform下实现模块化插件编程-优化版

    上一篇<分享在winform下实现模块化插件编程>已经实现了模块化编程,但我认为不够完美,存在以下几个问题: 1.IAppContext中的CreatePlugInForm方法只能依据完整 ...

  6. 分享在winform下实现模块化插件编程

    其实很早之前我就已经了解了在winform下实现插件编程,原理很简单,主要实现思路就是:先定一个插件接口作为插件样式及功能的约定,然后具体的插件就去实现这个插件接口,最后宿主(应用程序本身)就利用反射 ...

  7. 分享在winform下实现左右布局多窗口界面

    在web页面上我们可以通过frameset,iframe嵌套框架很容易实现各种导航+内容的布局界面,而在winform.WPF中实现其实也很容易,我这里就分享一个:在winform下实现左右布局多窗口 ...

  8. 在winform下实现左右布局多窗口界面的方法(一)

    在web页面上我们可以通过frameset,iframe嵌套框架很容易实现各种导航+内容的布局界面,而在winform.WPF中实现其实也很容易,通过本文给大家介绍在winform下实现左右布局多窗口 ...

  9. 分享在winform下实现左右布局多窗口界面-续篇

    之前的这篇文章<分享在winform下实现左右布局多窗口界面>已经实现了左右布局多窗口界面,今天本来是研究基于winform的插件编程,没想到顺便又找到了另一种实现方案,这种实现方案更简单 ...

随机推荐

  1. ActiveMQ简单介绍以及安装

    概述 首先简单的介绍一下MQ,MQ英文名MessageQueue,中文名也就是大家用的消息队列,干嘛用的呢,说白了就是一个消息的接受和转发的容器,可用于消息推送. ActiveMQ是Apache所提供 ...

  2. JVM垃圾回收机制总结(3) :按代垃圾收集器

    为什么要分代 分代的垃圾回收策略,是基于这样一个事实:不同的对象的生命周期是不一样的 . 因此,不同生命周期的对象可以采取不同的收集方式,以便提高回收效率. 在Java程序运行的过程中,会产生大量的对 ...

  3. CentOS 7快速搭建Nodejs开发环境

    Node.js是一个事件驱动I/O服务端JavaScript环境,基于Google的V8引擎,V8引擎执行Javascript的速度非常快,性能非常好.学习Nodejs首先需要会安装环境.这里我介绍如 ...

  4. Java:内部类(静态内部类、成员内部类、局部内部类、匿名内部类)

    Java基础_内部类:在Java中,可以将一个类定义在另一个类里面或者一个方法里面,这样的类称为内部类. 内部类的主要作用:使用内部类可以减少命名冲突. 定义位置:一个内部类可以定义在一个类中,也可以 ...

  5. 处理11gR2 RAC集群资源状态异常INTERMEDIATE,CHECK TIMED OUT

    注意节点6,7的磁盘CRSDG的状态明显不正常.oracle@ZJHZ-PS-CMREAD-SV-RPTDW06-DB-SD:~> crsctl status resource -t |less ...

  6. React getInitialState desc

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  7. Mac下无法拷贝文件到移动硬盘

    Mac下无法拷贝文件到移动硬盘? 是移动硬盘的文件格式的问题. Mac系统无法识别 NTFS 格式的文件. 将移动硬盘格式化为 exFAT 格式的. 别担心,exFAT 格式的硬盘在Windows下也 ...

  8. 详细记录python的range()函数用法

    使用python的人都知道range()函数很方便,今天再用到他的时候发现了很多以前看到过但是忘记的细节.这里记录一下range(),复习下list的slide,最后分析一个好玩儿的冒泡程序. 这里记 ...

  9. 12.allegro环境设置[原创]

    一.菜单简介 --- 分割电源,分割平面 ------- ------- ------- ----- --------- ---- --------------- ----------------- ...

  10. 自定义View(7)draw与onDraw区别

    draw()这个函数本身会做很多事情,可参看源码.         *      1. Draw the background         *      2. If necessary, save ...