Log4Net使用指南

声明:本文内容主要译自Nauman Leghari的Using log4net,亦加入了个人的一点心得(节3.1.4)。
请在这里下载示例代码

1 简介

1.1 Log4net的优点:

几乎所有的大型应用都会有自己的用于跟踪调试的API。因为一旦程序被部署以后,就不太可能再利用专门的调试工具了。然而一个管理员可能需要有一套强大的日志系统来诊断和修复配置上的问题。

经验表明,日志记录往往是软件开发周期中的重要组成部分。它具有以下几个优点:它可以提供应用程序运行时的精确环境,可供开发人员尽快找到应用程序中的Bug;一旦在程序中加入了Log 输出代码,程序运行过程中就能生成并输出日志信息而无需人工干预。另外,日志信息可以输出到不同的地方(控制台,文件等)以备以后研究之用。

Log4net就是为这样一个目的设计的,用于.NET开发环境的日志记录包。

1.2 Log4net的安装:

用户可以从http://logging.apache.org/log4net/下载log4net的源代码。解压软件包后,在解压的src目录下将log4net.sln载入Visual Studio .NET,编译后可以得到log4net.dll。用户要在自己的程序里加入日志功能,只需将log4net.dll引入工程即可。

 

2 Log4net的结构

log4net 有四种主要的组件,分别是Logger(记录器), Repository(库), Appender(附着器)以及 Layout(布局).

2.1 Logger

2.1.1 Logger接口

Logger是应用程序需要交互的主要组件,它用来产生日志消息。产生的日志消息并不直接显示,还要预先经过Layout的格式化处理后才会输出。

Logger提供了多种方式来记录一个日志消息,你可以在你的应用程序里创建多个Logger,每个实例化的Logger对象都被log4net框架作为命名实体(named entity)来维护。这意味着为了重用Logger对象,你不必将它在不同的类或对象间传递,只需要用它的名字为参数调用就可以了。log4net框架使用继承体系,继承体系类似于.NET中的名字空间。也就是说,如果有两个logger,分别被定义为a.b.c和a.b,那么我们说a.b是a.b.c的祖先。每一个logger都继承了祖先的属性 继续阅读Log4Net使用指南

(转)做Java开发这一年

从去年到现在,从.NET转向Java开发(只是因为项目原因,绝对与平台好坏没有关系)差不多有一年的时间了。通过这一年时间也有些感触,想从几个面比较一下这两个平台。希望能做到客观公正。

语言

我原来是使用C#语言的,和现在的Java语言相比,现在的Java语言语法就停留在C# 2.0这个年代。语法结构都非常传统,中规中矩。很突出的一点是,因为缺少对闭包的支持,有些用C#很容易做到的,用Java需要写很多废话代码。

前几天InfoQ上发表了一篇英国卫报逐步采用Scala替换Java的文章里一句话用的很好:看Java的代码很容易让你只见树木,不见森林。因为为了实现某个功能,你需要太多的支撑代码,而实现功能的关键代码却迷失了。

举个例子:我需要一个排好序的用户列表,排序的依据是用户名字。很简单的需求对不。自然的代码肯定是这样的:

IList<User> users = …

users.OrderBy(user => user.Name);
继续阅读(转)做Java开发这一年

DevExpress中的gridControl图片的显示

        private void showData(List<Employee > list)
        {
            DataTable dt = new DataTable("OneEmployee");
            dt.Columns.Add("Caption", System.Type.GetType("System.String"));
            dt.Columns.Add("Department", System.Type.GetType("System.String"));
            dt.Columns.Add("PhotoName", System.Type.GetType("System.Byte[]"));

            for (int i = 0; i < list.Count; i++)
            {
                DataRow dr = dt.NewRow();
                dr["Caption"] = list[i].Name;
                dr["Department"] = list[i].Department;
                string imagePath = @"D:\C#\photos\" + list[i].PhotoPath;
                dr["PhotoName"] = getImageByte(imagePath);
                dt.Rows.Add(dr);
            }
            gridControl1.DataSource = dt;
        }

        //返回图片的字节流byte[]
        private byte[] getImageByte(string imagePath)
        {
            FileStream files = new FileStream(imagePath, FileMode.Open);
            byte[] imgByte = new byte [files.Length ];
            files.Read(imgByte, 0, imgByte.Length);
            files.Close();
            return imgByte;
        }

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/alen0707/archive/2009/05/20/4203807.aspx

DevExpress中GridControl的属性设置

1.隐藏最上面的GroupPanel

  gridView1.OptionsView.ShowGroupPanel=false;

2.得到当前选定记录某字段的值

  sValue=Table.Rows[gridView1.FocusedRowHandle][FieldName].ToString();

3.数据只读

  gridView1.OptionsBehavior.Editable=false;

4.不显示MasterDetailView

gridView1.OptionsDetail.EnableMasterViewMode=false;

5.修改最上面的GroupPanel内容

继续阅读DevExpress中GridControl的属性设置

在.Net程序中写入XML文件并读取

快要学XML了 顺便在网上找了一些XML的操作实例,然后做了一下练习

            xmlString =
                  @"<Userinfo>
                       <userName>张三</userName>
                       <userPwd>123</userPwd>
                       <userName>李四</userName>
                       <userPwd>123</userPwd>
                       <userName>王五</userName>
                       <userPwd>123</userPwd>
                       <userName>赵六</userName>
                       <userPwd>123</userPwd>
                    </Userinfo>";

http://farm6.static.flickr.com/5124/5335091981_e00590520d.jpg

继续阅读在.Net程序中写入XML文件并读取

浅谈 .NET 程序的编译时间

我们在编写 .NET 程序时,经常会在该程序的“关于本软件”对话框中给出这个程序的编译时间,如下图所示:

上图中的编译时间是如果得到的呢?其实是在其 C# 源程序中有这么一句:

[assembly: AssemblyVersion("1.3.*")]

上述语句使用了 System.Reflection.AssemblyVersionAttribute 类,该类用于指定正在特性化的程序集的版本。在 MSDN 文档中有以下描述:

程序集版本号是程序集标识的一部分,在绑定到程序集时以及在版本策略中扮演着关键的角色。
版本号包含以下四部分:<主版本(Major)>.<次版本(Minor)>.<内部版本号(Build)>.<修订号(Revision)>
您可以指定所有这些值,也可使用星号 (*) 表示接受默认的内部版本号、修订号,或者接受二者。 例如,
[assembly:AssemblyVersion("2.3.25.1")] 指示主版本为 2,次版本为 3,内部版本号为 25,修订号为 1。 版本号 [assembly:AssemblyVersion("1.2.*")] 指定主版本为 1,次版本为 2,并接受默认的内部版本号和修订号。 版本号 [assembly:AssemblyVersion("1.2.15.*")] 指定主版本为 1,次版本为 2,内部版本号为 15,并接受默认的修订号。
默认的内部版本号每日增加。 默认修订号是随机的。

具体来说,默认的内部版本号表示自2000年1月1日以来的天数,而默认修订号也不是随机的,表示自该天午夜零时以来的秒数的一半。于是就可以使用下面的表达式获得 .NET 程序的编译时间:

new DateTime(2000, 1, 1).AddDays(version.Build).AddSeconds(version.Revision * 2)

 

但是,还有很多 .NET 程序的程序集版本号没有使用星号来接受默认的内部版本号、修订号,就不能使用这个方法了。我们知道,.NET 程序也是一个标准的32位或64位的 Microsoft Windows 可执行体(PE32,Portable Executable)文件。而PE文件头中包含一个时间标记来指出文件的生成时间,请参见:“Microsoft可移植可执行文件和通用目标文件格式文件规范v8.1修订版”和“Microsoft Portable Executable and Common Object File Format Specification”。具体来说就是:

PE文件头由Microsoft MS-DOS®占位程序、PE文件签名、COFF文件头以及可选文件头组成,COFF目标文件头由COFF文件头和可选文件头组成。在这两种情况下,文件头后面紧跟着的都是节头。
MS-DOS占位程序是一个运行于MS‑DOS下的合法应用程序,它被放在EXE映像的最前面。在位置0x3C处,这个占位程序包含PE文件签名的偏移地址。
在MS-DOS占位程序后面、在偏移0x3C指定的文件偏移处,是一个4字节的签名,它用来标识文件为一个PE格式的映像文件。这个签名是“PE\0\0”(字母“P”和“E”后跟着两个空字节)。
紧跟着映像文件签名之后,是一个标准COFF文件头。在这个COFF文件头的偏移为4开始的4个字节就是从UTC时间1970年1月1日00:00起的总秒数(一个C运行时time_t类型的值)的低32位,它指出文件何时被创建。

一个PE文件的例子如下图所示:

继续阅读浅谈 .NET 程序的编译时间

关于mvc与三层架构

最近在学习mvc设计模式,拿它和三层架构做了一些比较:
我认为mvc设计模式,关键在于构建model,model就是mvc模式的灵魂,他包含了三层架构里面的 “实体规范层”、“行为规则层”、“数据访问层”;控制器(Controller)用来收集view提供的用户数据,传递给model,同时返回model处理后的数据给view。model的设计可以参考三层架构的设计方法,将实体、行为规则(业务逻辑)和数据访问分开,在数据访问上可以应用orm框架。三层架构同样可以应用orm框架。个人认为三层架构和mvc都是很好的设计方法,目的都是降低系统的耦合性,提高重用率,提高系统的可维护性,可以根据喜好进行选择。 继续阅读关于mvc与三层架构

浅析ASP.NET生成随机密码

在开发需要用户注册后才能使用提供的各项功能的应用程序时,在新用户提交注册信息后,较常见的做法是由程序生成随机密码,然后发送密码到用户注册时填写的电子信箱,用户再用收到的密码来激活其帐户。

实现ASP.NET生成随机密码功能是很容易的,下面的代码给出了完整的实现方法:

 
publicstaticstringMakePassword(stringpwdchars,intpwdlen)
{
stringtmpstr="";
intiRandNum;
Randomrnd=newRandom();
for(inti=0; i{
iRandNum=rnd.Next(pwdchars.Length);
tmpstr+=pwdchars[iRandNum];
}
returntmpstr;
}

继续阅读浅析ASP.NET生成随机密码