一个简单的.net写日志方法 - 可能的改进点

昨天有个朋友在评论的时候问我如下代码在web开发中有什么问题

public void Log(string msg)
{
System.IO.File.AppendAllText(Server.MapPath("~/log.txt"), msg);
}

这里能说的点太多了....只好新开一个文章来说,而且也只是选重点的说

 

功能

1.线程不安全

  asp.net是原生的多线程的框架,那么日志类必须是多线程安全的, 该类库内部使用了File类来附加日志,而这个部分不是线程安全的,这里有一个BUG (windows资源.例如网络 文件 在asp.net中都要注意多线程同步)

  改进方案:最最简单的办法是加lock,(其他的改进方案之后再提)

2.方法未做输入检查

  所有public的输入参数 要做输入值检查,如果是null或者是empty,那么就不要再调用File类写日志, 这样会有性能和健壮性上的提高(最常见的问题就是未将对象引用到设置对象的实例)

  解决方案:做输入值检查

3. IIS默认帐号对于 Server.MapPath("~/log.txt") 这个路径是没有写入/修改权限的 (可能在生产环境你才会发现这个问题)

  解决方案:配置IIS帐号权限,或者是配置一个有权限的目录 (推荐后者)

4.未做try catch( 是否需要try catch,要考虑实际情况)

  一般来说写日志的方法是不会抛出异常的,如果没有catch( 可以在内部 也可以在外部catch,我个人推荐外部) 会导致程序/逻辑中止

  绝对要避免日志这样的非核心逻辑 导致业务逻辑的中止

安全性

1.将日志写入网站根目录是一种高风险的行为,第一是需要额外的权限,第二是有可能存在写入程序文件(例如有些人写入aspx文件)

  解决方案:配置一个网站根目录外的日志目录

性能

1.采用异步写入的方式提高性能

  即 写入队列,定时刷新队列到数据文件; 由于写入的瓶颈一般在IO上,这样的话性能会好很多;当然,如果忽然断电,就有可能丢失数据 (小概率事件,我们考虑性能多过这一点小瑕疵)

  这也是我最喜欢的方式,但是该方式需要开发人员有较高的水平,而且方案复杂,开发时间长...唯一的好处就是性能高....写日志响应时间短

2.采用其他的写日志的方式

  例如CLFS windows2008开始支持common log file system,

  如果不是windows 2008 直接打开一个FileStream 然后保存在本地变量中会更好, 不要每写一条日志都打开文件又关闭

3.将实例方法替换为静态方法(或者至少使用call而不是callvirt来调用方法)  [具体使用具体分析]

扩展性和可维护性

1.日志路径不应该是写死的Server.MapPath("~/log.txt")  这样这个日志只能被web程序使用,而不能被windows form 或者服务器应用程序等其他应用程序使用

2.日志路径不应该写死,而是应该可配置,至少应该有一个独立的成员存储(可预期写日志的方法必然有非常多的重载)

3.日志类这种基本类库一般使用静态方法, 好歹不要每次使用都new一个 [具体使用具体分析]

4.有可能的话,第三方类库,例如log4net是一个比较好的方案

5.如果是生产环境的代码,这个命名还有注释都是完全不合格的..

6.不推荐使用完整的命名空间 (文本太多...烦 哈哈)

 

就一个写日志的方法,我们做设计的时候,总是要考虑:(优先级和项目类型有关)

1.团队能否有足够的能力完成

2.开发时间

3.复杂程度 (导致维护成本上升)

4.程序稳定性

5.性能

6.目前已经存在的技术体系和类库. (复用性啊什么的...)

7.其他的和一时想不起来的因素(例如大老板说要这么做......好吧 你是老板你说了算 哈哈  just kidding)

可能考虑的还不够全面,毕竟时间有限...最近太忙了

如有遗漏 还请各位帮忙补充下

具体的代码就不提供了, 一般我们做日志都是公司级的日志, 所有的服务器会通过网络传输到日志集群服务器, 这和简单的文件日志是完全不一样的体系

简单的文件日志,我们也会用很简单方式来写入.....(在某些项目中,最简单就是最适合,)

项目类型和开发时间需要, 稍微复杂点的我们会用log4net之类的第三方日志库来做

最简单的日志也许几分钟就写好了, 最复杂的日志做了几个月才是一个架子.......

.net日志专用的更多相关文章

  1. LOG4NET日志配置及使用

    Log4net的安装 Install-Package log4net 1.先弄个日志记录的类 /// <summary> /// 使用LOG4NET记录日志的功能,在WEB.CONFIG里 ...

  2. LOG4NET开源日志dll引用流程,在net3.5中已经实践ok

    一,在app.config中配置 <?xml version="1.0"?><configuration> <configSections> & ...

  3. log4net 日志配置及使用

    一.log4net按照不同的[LEVEL]级别输出到不同文件 <log4net> <!--错误日志:::记录错误日志--> <!--按日期分割日志文件 一天一个--> ...

  4. MySQL日志文件与分析

    1.查询日志.慢查询日志.二进制日志对比 查询日志 general_log 会记录用户的所有操作,其中包含增删查改等 可以指定输出为表 慢查询日志 slow_log 只要超过定义时间的所有操作语句都记 ...

  5. .net 项目如何添加log4net日志记录

    1.在项目根目录新建文件log4net.config,此文件中的节点解释还请自动百度. 文件实例: <?xml version="1.0"?><configura ...

  6. 从0搭建一个基于 ELK 的日志、指标收集与监控系统

    为了使得私有化部署的系统能更健壮,同时不增加额外的部署运维工作量,本文提出了一种基于 ELK 的开箱即用的日志和指标收集方案. 在当前的项目中,我们已经使用了 Elasticsearch 作为业务的数 ...

  7. Log4Net配置以及使用

    跟踪程序代码,及时发现程序的运行状态,是每个成熟的软件所必不可少的一个环节,网站发布到真实的环境之后,对于程序的运行状态,我们并不能想开发环境那也,点击调试.日志记录显示就尤为重要,在.NET中记录日 ...

  8. Log4Net简单使用

    一. Log4net是什么.优点 用来记录程序日志,优点:1.提供应用程序运行时的精确环境,可供开发人员尽快找到应用程序中的Bug:2.日志信息可以输出到不同的地方(数据库,文件,邮箱等). 二. L ...

  9. Log4.net使用配置

    开发中经常使用到日志记录功能,Log4.net可以将日志记录到文件中,也可以记录到数据库中,使用非常方便,之前也一直在用,最近也参照了一下网上的资料,想简单总结一下 本文重在通过通用日志类来使用Log ...

随机推荐

  1. mac下firefox复制粘贴失效解决办法

    现象:复制粘贴只能在firefox上操作,也就是其他应用内的内容无法复制到firefox,firefox的内容也无法复制其他应用,但是firefox自己的内容可以复制本身(比如各个tab页之间复制) ...

  2. Visual C++ 2012/2013的内存溢出检測工具

    在过去,每次编写C/C++程序的时候,VLD差点儿是我的标配.有了它,就能够放心地敲代码,随时发现内存溢出. VLD最高可支持到Visual Studio 2012.不知道以后会不会支持Visual ...

  3. zend studio-如何更改字符集

    在加载一个项目的过程中很时候会因为字符集的不匹配从而导致项目文件显示为乱码,zend studio开发工具应该如何设置字符集呢: 打开[windows]-[preference]-[workspace ...

  4. localtunnel.me 原理流程浅析

      本文採用知识共享署名-同样方式共享 4.0 国际许可协议进行许可. 近期公司的项目须要一个后台server,要求能将内网的WEBserver暴露在外网上.于是.就在网上到处搜开源项目.找到两个口碑 ...

  5. 总结swift语言常见的20个问题和回答

    1.假设我是个刚入门的iOS开发人员,选swift学习呢,还是选objective-c学习,还是两个都学? 这个能够依据两种情况来决定:1.我想进入公司担任iOS开发的职位    2.我仅仅想做个独立 ...

  6. 文件和目录之mkdir和rmdir函数

    用mkdir函数创建目录,用rmdir函数删除目录. #include <sys/stat.h> int mkdir( const char *pathname, mode_t mode ...

  7. google DNS

    DNS 8.8.8.8 然后 C:\Windows\System32\drivers\etc\hosts 108.111.1.1  www.s.com

  8. H5 canvas 小demo之小球的随机运动

    1:结构之html----balls.html <!DOCTYPE html> <html> <head lang="en"> <meta ...

  9. Struts,Spring,Hibernate的作用

    Spring的作用: 在SSH框假中spring充当了管理容器的角色.我们都知道Hibernate用来做持久层,因 为它将JDBC做了一个良好的封装,程序员在与数据库进行交互时可以不用书写大量的SQL ...

  10. String类概述

    (1)多个字符组成的一串数据.        其实它可以和字符数组进行相互转换.    (2)构造方法:        A:public String()        B:public String ...