前言

一个完整的项目工程离不开日志文件的记录,而记录文件的方法也有很多,可以自己通过Stream去实现文件的读写来完成日志记录,但是如果有个好的封装类库,那为什么不去用呢?

.net日志记录,NLog,log4都可以,用什么都可以,根据自己喜好,我常用log4,所以这里还是介绍Log4的引用及用法。

log4net

这个log4从开发到现在,从netframework开始用,一个config文件就够了,NLog没用过,但是应该都是大差不差,毕竟名字都这么相似嘛(手动滑稽)

依然是,NuGet引用第三方类库

工具->NuGet包管理器->管理解决方案的NuGet程序包…

在浏览中查找"log4",选择项目工程,点击安装。



安装完成后,依然是来Startup.cs,这次在构造函数直接声明实例化。

  1. public Startup(IConfiguration configuration)
  2. {
  3. Configuration = configuration;
  4. repository = LogManager.CreateRepository("AprilLog");
  5. XmlConfigurator.Configure(repository, new FileInfo("Config/log4net.config"));//配置文件路径可以自定义
  6. BasicConfigurator.Configure(repository);
  7. }
  8. //log4net日志
  9. public static ILoggerRepository repository { get; set; }

配置文件的创建可以在工程目录下新建一个config文件,配置信息如下,需要标注的信息基本上都在文件注释中,不过多阐述:

  1. <?xml version="1.0" encoding="utf-8" ?>
  2. <configuration>
  3. <!-- This section contains the log4net configuration settings -->
  4. <log4net debug="false">
  5. <appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">
  6. <lockingModel type="log4net.Appender.FileAppender+MinimalLock" /><!--很关键的一句,让日志文件不被占用-->
  7. <file value="logs/" /> <!-- 日志生成文件路径 -->
  8. <appendToFile value="true" />
  9. <rollingStyle value="Composite" />
  10. <staticLogFileName value="false" />
  11. <datePattern value="yyyyMMdd'.log'" /> <!-- 日志文件名称格式 -->
  12. <maxSizeRollBackups value="10" />
  13. <maximumFileSize value="10MB" /> <!-- 最大文件大小,达到后生成新文件 -->
  14. <layout type="log4net.Layout.PatternLayout">
  15. <conversionPattern value="%date [%thread] %-5level %logger - %message%newline" /> <!-- 生成日志格式 -->
  16. </layout>
  17. </appender>
  18. <!-- Setup the root category, add the appenders and set the default level -->
  19. <root>
  20. <level value="ALL" /> <!-- 日志等级 -->
  21. <appender-ref ref="RollingLogFileAppender" />
  22. </root>
  23. </log4net>
  24. </configuration>

创建完成后,还是要对比下你的配置文件目录与实际目录是否一致。



OK,全部确认完成后,可以在需要用到Log的地方,添加以下代码:

  1. private ILog log = LogManager.GetLogger(Startup.repository.Name, "Name");

  2. log.Info("测试");

例如我们继续拿Values这个控制器开刀。

写好之后我们运行代码,运行后我们可以看到工程目录已经有了logs这个文件夹,打开日志文件。



这样我们就可以在日常使用中记录日志,方便调试记录,追踪问题所在。

整合LogUtil

我这个人比较懒,并且我也不需要关心它是在哪运行,我只想要记录的时候调用下方法,所以对日志记录做了封装调整。

首先,新建类库工程,Apirl.Util(这个工程应该刚开始都创建的-,-||)。



类库工程新建完成的第一件事,干掉Class.cs(我要这示例有何用)

将log4net通过NuGet引入Util工程,过程不过多说了,引用的介绍已经可以了。

引用完成后,在WebApi工程引入Util。



选中Util这个类库工程。

题外话,其实NuGet引入第三方类库在一个项目工程即可,其他工程只要引用对应的项目工程,也可以使用对应的第三方类库,即我在Util引入log4,我就没必要在WebApi工程再引入,这里只是为了讲解说明。

新建LogUtil这个类,代码如下。

  1. public class LogUtil
  2. {
  3. private static readonly ILog log = LogManager.GetLogger("AprilLog", typeof(LogUtil));
  4. /// <summary>
  5. /// 调试日志
  6. /// </summary>
  7. /// <param name="msg"></param>
  8. /// <param name="obj"></param>
  9. public static void Debug(string msg, object obj = null)
  10. {
  11. if (log.IsDebugEnabled && !string.IsNullOrEmpty(msg))
  12. {
  13. if (obj == null)
  14. {
  15. log.Debug(msg);
  16. }
  17. else
  18. {
  19. log.DebugFormat(msg, obj);
  20. }
  21. }
  22. }
  23. /// <summary>
  24. /// 日常日志
  25. /// </summary>
  26. /// <param name="msg"></param>
  27. /// <param name="obj"></param>
  28. public static void Info(string msg, object obj = null)
  29. {
  30. if (log.IsInfoEnabled && !string.IsNullOrEmpty(msg))
  31. {
  32. if (obj == null)
  33. {
  34. log.Info(msg);
  35. }
  36. else
  37. {
  38. log.InfoFormat(msg, obj);
  39. }
  40. }
  41. }
  42. /// <summary>
  43. /// 错误日志
  44. /// </summary>
  45. /// <param name="msg"></param>
  46. /// <param name="obj"></param>
  47. public static void Error(string msg, object obj = null)
  48. {
  49. if (log.IsErrorEnabled && !string.IsNullOrEmpty(msg))
  50. {
  51. if (obj == null)
  52. {
  53. log.Error(msg);
  54. }
  55. else
  56. {
  57. log.ErrorFormat(msg, obj);
  58. }
  59. }
  60. }
  61. /// <summary>
  62. /// 重要日志
  63. /// </summary>
  64. /// <param name="msg"></param>
  65. /// <param name="obj"></param>
  66. public static void Fatal(string msg, object obj = null)
  67. {
  68. if (log.IsFatalEnabled && !string.IsNullOrEmpty(msg))
  69. {
  70. if (obj == null)
  71. {
  72. log.Fatal(msg);
  73. }
  74. else
  75. {
  76. log.FatalFormat(msg, obj);
  77. }
  78. }
  79. }
  80. }

下完之后,继续ValuesController(Why一直是这),更改代码如下:



运行看下效果。

小结

封装的好处是为了省事,哪里需要写(点)哪里,咳咳,日志的重要性在代码里面不言而喻,没有日志的工程是不健全的,程序猿可以不会写逻辑,不去考虑架构,不去优化性能,但是日志的记录,代码的注释是不可或缺的,毕竟如果想活着,这两个地方还是多注意吧。

下一节,开始缓存机制

net core Webapi基础工程搭建(四)——日志功能log4net的更多相关文章

  1. net core Webapi基础工程搭建(六)——数据库操作_Part 1

    目录 前言 SqlSugar Service层 BaseService(基类) 小结 前言 后端开发最常打交道的就是数据库了(静态网站靠边),上一篇net core Webapi基础工程搭建(五)-- ...

  2. net core Webapi基础工程搭建(六)——数据库操作_Part 2

    目录 前言 开始 使用 小结 前言 昨天是写着写着发现,时间不早了,已经养成了晚上下班抽时间看看能写点儿啥的习惯(貌似),今天实在是不想让昨天没做完的事情影响,所以又坐下,沉下心(周末了),开始把数据 ...

  3. net core Webapi基础工程搭建(七)——小试AOP及常规测试_Part 2

    目录 前言 引入 自定义属性 测试 小结 前言 前一篇讲到了中间层的使用,可能不是那么AOP,今天主要来说下一个轻量级的AOP第三方类库AspectoCore. 简单介绍下这个类库,AspectCor ...

  4. net core Webapi基础工程搭建(五)——缓存机制

    目录 前言 Cache Session Cookie 小结 补充 前言 作为WebApi接口工程,性能效率是必不可少的,每次的访问请求,数据库读取,业务逻辑处理都或多或少耗费时间,偶尔再来个各种花式f ...

  5. net core Webapi基础工程搭建(二)——创建工程

    目录 前言 创建工程 工程文件概述(个人理解) 运行 小结 前言 前面介绍了开发工具及net core版本,后端工程的框架结构开发工具及环境,因为是基础工程,所以没考虑太复杂的框架,如果有架构师请勿喷 ...

  6. net core Webapi基础工程搭建(七)——小试AOP及常规测试_Part 1

    目录 前言 拦截器 异常拦截器 测试结果 身份验证拦截器 测试 小结 补充 2019-07-31 前言 一天天不知道怎么过的,但确实挺忙,事赶事不带停那种,让我感觉跟在流水线干活一样,忙活的事差不多了 ...

  7. net core Webapi基础工程搭建(三)——在线接口文档Swagger

    目录 前言 Swagger NuGet引用第三方类库 别急,还有 没错,注释 小结 前言 前后分离的好处,就是后端埋头做业务逻辑功能,不需要过多考虑用户体验,只专注于数据.性能开发,对于前端需要的数据 ...

  8. net core Webapi基础工程搭建(一)——开发工具及环境

    目录 开发工具 版本 后端框架 开发工具 Visual Studio 2019,既然要折腾那就体验最新版的开发工具有什么特殊的地方,之前个人开发使用的是2017. 下载地址:https://visua ...

  9. Asp.Net Core WebApi学习笔记(四)-- Middleware

    Asp.Net Core WebApi学习笔记(四)-- Middleware 本文记录了Asp.Net管道模型和Asp.Net Core的Middleware模型的对比,并在上一篇的基础上增加Mid ...

随机推荐

  1. 动态规划(1)——最长子序列(LCS)问题

    最长子序列问题:从中找出最长的字符序列,比如: cnblogs和belong.这两个字符串的最长子序列就是blog. 动态规划:通过分解大问题,不断的将大问题变成小问题,最终整合所有解,得出最优解(和 ...

  2. 【Netty】使用解码器Decoder解决TCP粘包和拆包问题

    解码器Decoder和ChannelHandler的关系 netty的解码器通常是继承自ByteToMessageDecoder,而它又是继承自ChannelInboundHandlerAdapter ...

  3. Flutter学习笔记(9)--组件Widget

    如需转载,请注明出处:Flutter学习笔记(9)--组件Widget 在Flutter中,所有的显示都是Widget,Widget是一切的基础,我们可以通过修改数据,再用setState设置数据(调 ...

  4. WePY的脱胎换骨

    对于前端来说,尤其是开发小程序的前端来说,WePY框架一定不陌生,他是一种小程序开发框架.而且是属于类Vue风格,掌握Vue再来学习WePY学习成本极低. 今天为啥要写这篇文章呢,因为在复习WePY时 ...

  5. Excel催化剂开源第29波-在Winform上使用富文本编辑器控件

    富文本编辑器,一般都是BS架构专利一般,好像百度有一个开源的比较出名,但无奈这些都只能用在JS上,在BS网页端开发上使用.像Winform开发的VSTO,只能羡慕的份.和一般Winform上用的Ric ...

  6. TCP协议传输大文件读取时候的问题

    TCP协议传输大文件读取时候的问题 大文件传不完的bug 我们在定义的时候定义服务端每次文件读取大小为10240, 客户端每次接受大小为10240 我们想当然的认为客户端每次读取大小就是10240而把 ...

  7. Linux学习之安装jdk

    下载jdk for linux jdk for linux oracle download 卸载已有的jdk (1)查询是否安装java软件: rpm -qa|grep java (2)卸载jdk: ...

  8. 基于python图片识别工具(图片识别,车牌,PDF,验证码)

    先上图  不多说. 对于一般的用户来说识别率还是能达到百分之90以上. 已经打包成exe文件.windows用户可以直接使用.要软件的加我QQ python代码: # -*- coding: UTF- ...

  9. context创建过程解析(一)之deployDescriptors

    总结:主要是创建Context对象,并且将默认context配置,host级别配置,context配置的值设置进去,设置docBase,如果是war包就解压到webapp的目录中,重新设置docBas ...

  10. linux自学

    Linux文件与目录管理   所有不太会的命令,可以用man +命令,查看相关解释文档   绝对路径:从根路径写起的路径,/usr/local 相对路径:例如:路径a:~/demo/test  路径b ...