net core Webapi基础工程搭建(四)——日志功能log4net
前言
一个完整的项目工程离不开日志文件的记录,而记录文件的方法也有很多,可以自己通过Stream去实现文件的读写来完成日志记录,但是如果有个好的封装类库,那为什么不去用呢?
.net日志记录,NLog,log4都可以,用什么都可以,根据自己喜好,我常用log4,所以这里还是介绍Log4的引用及用法。
log4net
这个log4从开发到现在,从netframework开始用,一个config文件就够了,NLog没用过,但是应该都是大差不差,毕竟名字都这么相似嘛(手动滑稽)
依然是,NuGet引用第三方类库
工具->NuGet包管理器->管理解决方案的NuGet程序包…
在浏览中查找"log4",选择项目工程,点击安装。
安装完成后,依然是来Startup.cs,这次在构造函数直接声明实例化。
public Startup(IConfiguration configuration)
{
Configuration = configuration;
repository = LogManager.CreateRepository("AprilLog");
XmlConfigurator.Configure(repository, new FileInfo("Config/log4net.config"));//配置文件路径可以自定义
BasicConfigurator.Configure(repository);
}
//log4net日志
public static ILoggerRepository repository { get; set; }
配置文件的创建可以在工程目录下新建一个config文件,配置信息如下,需要标注的信息基本上都在文件注释中,不过多阐述:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<!-- This section contains the log4net configuration settings -->
<log4net debug="false">
<appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">
<lockingModel type="log4net.Appender.FileAppender+MinimalLock" /><!--很关键的一句,让日志文件不被占用-->
<file value="logs/" /> <!-- 日志生成文件路径 -->
<appendToFile value="true" />
<rollingStyle value="Composite" />
<staticLogFileName value="false" />
<datePattern value="yyyyMMdd'.log'" /> <!-- 日志文件名称格式 -->
<maxSizeRollBackups value="10" />
<maximumFileSize value="10MB" /> <!-- 最大文件大小,达到后生成新文件 -->
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date [%thread] %-5level %logger - %message%newline" /> <!-- 生成日志格式 -->
</layout>
</appender>
<!-- Setup the root category, add the appenders and set the default level -->
<root>
<level value="ALL" /> <!-- 日志等级 -->
<appender-ref ref="RollingLogFileAppender" />
</root>
</log4net>
</configuration>
创建完成后,还是要对比下你的配置文件目录与实际目录是否一致。
OK,全部确认完成后,可以在需要用到Log的地方,添加以下代码:
private ILog log = LogManager.GetLogger(Startup.repository.Name, "Name");
…
log.Info("测试");
例如我们继续拿Values这个控制器开刀。
写好之后我们运行代码,运行后我们可以看到工程目录已经有了logs这个文件夹,打开日志文件。
这样我们就可以在日常使用中记录日志,方便调试记录,追踪问题所在。
整合LogUtil
我这个人比较懒,并且我也不需要关心它是在哪运行,我只想要记录的时候调用下方法,所以对日志记录做了封装调整。
首先,新建类库工程,Apirl.Util(这个工程应该刚开始都创建的-,-||)。
类库工程新建完成的第一件事,干掉Class.cs(我要这示例有何用)
将log4net通过NuGet引入Util工程,过程不过多说了,引用的介绍已经可以了。
引用完成后,在WebApi工程引入Util。
选中Util这个类库工程。
题外话,其实NuGet引入第三方类库在一个项目工程即可,其他工程只要引用对应的项目工程,也可以使用对应的第三方类库,即我在Util引入log4,我就没必要在WebApi工程再引入,这里只是为了讲解说明。
新建LogUtil这个类,代码如下。
public class LogUtil
{
private static readonly ILog log = LogManager.GetLogger("AprilLog", typeof(LogUtil));
/// <summary>
/// 调试日志
/// </summary>
/// <param name="msg"></param>
/// <param name="obj"></param>
public static void Debug(string msg, object obj = null)
{
if (log.IsDebugEnabled && !string.IsNullOrEmpty(msg))
{
if (obj == null)
{
log.Debug(msg);
}
else
{
log.DebugFormat(msg, obj);
}
}
}
/// <summary>
/// 日常日志
/// </summary>
/// <param name="msg"></param>
/// <param name="obj"></param>
public static void Info(string msg, object obj = null)
{
if (log.IsInfoEnabled && !string.IsNullOrEmpty(msg))
{
if (obj == null)
{
log.Info(msg);
}
else
{
log.InfoFormat(msg, obj);
}
}
}
/// <summary>
/// 错误日志
/// </summary>
/// <param name="msg"></param>
/// <param name="obj"></param>
public static void Error(string msg, object obj = null)
{
if (log.IsErrorEnabled && !string.IsNullOrEmpty(msg))
{
if (obj == null)
{
log.Error(msg);
}
else
{
log.ErrorFormat(msg, obj);
}
}
}
/// <summary>
/// 重要日志
/// </summary>
/// <param name="msg"></param>
/// <param name="obj"></param>
public static void Fatal(string msg, object obj = null)
{
if (log.IsFatalEnabled && !string.IsNullOrEmpty(msg))
{
if (obj == null)
{
log.Fatal(msg);
}
else
{
log.FatalFormat(msg, obj);
}
}
}
}
下完之后,继续ValuesController(Why一直是这),更改代码如下:
运行看下效果。
小结
封装的好处是为了省事,哪里需要写(点)哪里,咳咳,日志的重要性在代码里面不言而喻,没有日志的工程是不健全的,程序猿可以不会写逻辑,不去考虑架构,不去优化性能,但是日志的记录,代码的注释是不可或缺的,毕竟如果想活着,这两个地方还是多注意吧。
下一节,开始缓存机制。
net core Webapi基础工程搭建(四)——日志功能log4net的更多相关文章
- net core Webapi基础工程搭建(六)——数据库操作_Part 1
目录 前言 SqlSugar Service层 BaseService(基类) 小结 前言 后端开发最常打交道的就是数据库了(静态网站靠边),上一篇net core Webapi基础工程搭建(五)-- ...
- net core Webapi基础工程搭建(六)——数据库操作_Part 2
目录 前言 开始 使用 小结 前言 昨天是写着写着发现,时间不早了,已经养成了晚上下班抽时间看看能写点儿啥的习惯(貌似),今天实在是不想让昨天没做完的事情影响,所以又坐下,沉下心(周末了),开始把数据 ...
- net core Webapi基础工程搭建(七)——小试AOP及常规测试_Part 2
目录 前言 引入 自定义属性 测试 小结 前言 前一篇讲到了中间层的使用,可能不是那么AOP,今天主要来说下一个轻量级的AOP第三方类库AspectoCore. 简单介绍下这个类库,AspectCor ...
- net core Webapi基础工程搭建(五)——缓存机制
目录 前言 Cache Session Cookie 小结 补充 前言 作为WebApi接口工程,性能效率是必不可少的,每次的访问请求,数据库读取,业务逻辑处理都或多或少耗费时间,偶尔再来个各种花式f ...
- net core Webapi基础工程搭建(二)——创建工程
目录 前言 创建工程 工程文件概述(个人理解) 运行 小结 前言 前面介绍了开发工具及net core版本,后端工程的框架结构开发工具及环境,因为是基础工程,所以没考虑太复杂的框架,如果有架构师请勿喷 ...
- net core Webapi基础工程搭建(七)——小试AOP及常规测试_Part 1
目录 前言 拦截器 异常拦截器 测试结果 身份验证拦截器 测试 小结 补充 2019-07-31 前言 一天天不知道怎么过的,但确实挺忙,事赶事不带停那种,让我感觉跟在流水线干活一样,忙活的事差不多了 ...
- net core Webapi基础工程搭建(三)——在线接口文档Swagger
目录 前言 Swagger NuGet引用第三方类库 别急,还有 没错,注释 小结 前言 前后分离的好处,就是后端埋头做业务逻辑功能,不需要过多考虑用户体验,只专注于数据.性能开发,对于前端需要的数据 ...
- net core Webapi基础工程搭建(一)——开发工具及环境
目录 开发工具 版本 后端框架 开发工具 Visual Studio 2019,既然要折腾那就体验最新版的开发工具有什么特殊的地方,之前个人开发使用的是2017. 下载地址:https://visua ...
- Asp.Net Core WebApi学习笔记(四)-- Middleware
Asp.Net Core WebApi学习笔记(四)-- Middleware 本文记录了Asp.Net管道模型和Asp.Net Core的Middleware模型的对比,并在上一篇的基础上增加Mid ...
随机推荐
- 【弱化版】【P3371 【模板】单源最短路径(弱化版)】-C++
→原题传送门← 看到题目描述我就知道,这道题不能用SPFA[手动补滑稽] 那么我这道题目采用的是dijkstra算法不了解的去补一下知识哈. dij的模板: #include<bits/stdc ...
- py+selenium 明明定位不到元素,但却不报错或是报错AttributeError: 'list' object has no attribute 'click'【已解决】
问题:定位不到元素,但却不报错或者出现报错AttributeError: 'list' object has no attribute 'click' 如图 或者 解决方法: 将”driver ...
- PJzhang:python基础入门的7个疗程-five
猫宁!!! 参考链接:易灵微课-21天轻松掌握零基础python入门必修课 https://www.liaoxuefeng.com/wiki/1016959663602400 第十三天:代码组织 类是 ...
- 个人永久性免费-Excel催化剂功能第85波-灵活便捷的批量发送短信功能(使用腾讯云接口)
微信时代的今天,短信一样不可缺席,大系统都有集成短信接口.若只是临时用一下,若能够直接在Excel上加工好内容就可以直接发送,这些假设在此篇批量群发短信功能中都为大家带来完美答案. 业务场景 不多说, ...
- Excel催化剂开源第17波-VSTO开发之ADO.Net访问Sqlserver
在Excel催化剂中,独树一帜地推出了Excel与数据库交互功能,目前仅实现了对Sqlserver的交互,在通用型插件中仅此一家,别无其他. 为何会出现这样的局面呢,原因大概有以下几大方面: 和数据库 ...
- RecyclerView下拉加载集合越界问题
问题描述 在做毕业设计app中遇到这样一个问题,使用RecyclerView进行下拉加载数据的时候,比如我每次让它加载5条数据,当服务器端数据总数刚好是5的倍数的时候,不会出现下拉加载数据集合越界的问 ...
- Django REST Framework(DRF)_第一篇
认识RESTful REST是设计风格而不是标准,简单来讲REST规定url是用来唯一定位资源,而http请求方式则用来区分用户行为. REST接口设计规范 HTTP常用动词 GET /books:列 ...
- linux初学者-文件的归档和传输
1.文件归档 因为linux系统都是以文件的形式存在,所以在处理文件时有时候因为文件太多导致传输速度慢等问题,为了提高方便并且提高效率,常把文件归档,文件归档就是把多个文件变成一个归档文件. 文件 ...
- [NLP] 相对位置编码(一) Relative Position Representatitons (RPR) - Transformer
对于Transformer模型的positional encoding,最初在Attention is all you need的文章中提出的是进行绝对位置编码,之后Shaw在2018年的文章中提出了 ...
- Spring Cloud 之 Config与动态路由.
一.简介 Spring Cloud Confg 是用来为分布式系统中的基础设施和微服务应用提供集中化的外部配置支持,它分为服务端与客户端两个部分.其中服务端也称为分布式配置中心,它是一个独立的微服务 ...