- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我知道 NLog 中内置了一些日志级别,例如跟踪、信息、致命等
我想定义一些新的,例如“DBLog”,并且只能将所有带有 DBlog 的日志配置为针对某个目标。
有办法吗?或者我必须定义自定义日志?
最佳答案
@SemVanmeenen 是对的,NLog 不允许添加自定义级别(即扩展 LogLevel 类中的可能值)。另外,鉴于级别的工作方式,至少在 NLog 中,每个级别通常表示消息的优先级。因此,如果您将一些(或所有)记录器配置为仅记录错误和更高级别的消息,则不会记录任何跟踪、调试、信息和警告消息。 DBLog 级别适合哪里?这似乎更像是一个“类别”(可以有点类似于记录器名称)而不是一个级别。
您真的需要一个特殊级别(或多个级别)来记录诸如“DBLog”之类的内容吗?为什么不在您的配置文件中定义另一个名为“DBLog”的记录器?这样您就可以使用过滤和 Targets 将这些日志发送到特定的 Target 或打开或关闭该记录器。 See this link for some examples of stuff you can do with NLog configuration.
NLog 和 log4net 中最常见的模式之一是每个类都有一个记录器,如下所示:
class MyClass
{
private static readonly Logger logger = LogManager.GetCurrentClassLogger();
public void DoSomething(int x, int y);
{
logger.Info("Doing something. x = {0}, y = {1}", x, y);
//Or
logger.Log(LogLevel.Info, "Doing something. x = {0}, y = {1}", x, y);
}
}
您还可以使用任意记录器名称:
class MyDbClass
{
private static readonly Logger logger = LogManager.GetLogger("DbStuff");
public void DoSomething(int x, int y);
{
logger.Info("Doing something. x = {0}, y = {1}", x, y);
//Or
logger.Log(LogLevel.Info, "Doing something. x = {0}, y = {1}", x, y);
}
}
class MyOtherDbClass
{
private static readonly Logger logger = LogManager.GetLogger("DbStuff");
public void DoSomething(int x, int y);
{
logger.Info("Doing something. x = {0}, y = {1}", x, y);
//Or
logger.Log(LogLevel.Info, "Doing something. x = {0}, y = {1}", x, y);
}
}
在第二个示例中,两个类都使用相同的记录器(“DbStuff”),并且都可以根据该记录器名称进行控制(记录级别、目标等)。
您还可以在同一个类中使用不同的记录器(也许默认情况下您使用“每类”记录器样式,但您也可以定义一些“横切”记录器,以便更容易地记录和控制跨类的类似信息类)。您可能有一个名为“SQL”或“PERFORMANCE”的记录器,您偶尔会使用它来记录您希望在类级别以外的级别控制的特定信息。
使用不同的记录器名称,您当然可以将日志消息路由到不同的目标,而无需定义新的日志级别。
如果这没有帮助,也许您可以在您的问题中详细说明您到底想做什么。您希望自己可以编写什么样的日志记录代码,但您觉得自己现在无法编写?
[更新]
<logger name="Name.Space.Class1" minlevel="Debug" writeTo="f1" />
<logger name="Name.Space.Class1" levels="Debug,Error" writeTo="f1" />
<logger name="Name.Space.*" writeTo="f3,f4" />
<logger name="Name.Space.*" minlevel="Warn" writeTo="f3,f4" />
<logger name="Name.Space.*" minlevel="Debug" maxlevel="Error" final="true" />
假设 f1、f2、f3 和 f4 是文件目标。
第 1 行将使 Class1 的记录器写入 f1 目标以获取调试和更高级别的消息(即,将跳过跟踪)。
第 2 行将使 Class1 的记录器仅将调试和错误级别的消息写入 f1 目标(即,将跳过 Trace、Info、Warn 和 Fatal)
第 3 行将导致命名空间 Name.Space 中所有类的记录器写入目标 f3 和 f4,无论级别如何。
第 4 行将导致命名空间 Name.Space 中所有类的记录器仅在日志级别为 Warn 或更高时写入目标 f3 和 f4(即,将跳过 Trace、Debug 和 Info)
第 5 行将导致命名空间 Name.Space 中所有类的记录器拒绝级别介于 Debug 和 Error 之间的任何消息。它们被拒绝,因为没有 writeTo 子句。由于 final=true
这些示例展示了如何在记录器级别进行过滤。您可以使用 FilteringTargetWrapper 在目标级别进行进一步过滤。我没有使用过它,但是这里有一个配置 FilteringTargetWrapper 的例子:
Most useful NLog configurations
我从 NLog 1.0 刷新安装附带的帮助文件中获取了这些示例。我还没有安装 NLog 2.0,因为我正处于一个项目的中间,我更愿意等到 NLog 2.0 结束测试版后再转向它。如果您使用的是 NLog 2.0,并且帮助文件没有比 NLog 网站上更好的示例,您可以考虑至少安装 NLog 1.0 帮助。您可以在此处获得 NLog 1.0 帮助:http://nlog.codeplex.com/releases/view/32601
关于c# - Nlog 和自定义级别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5057061/
Android 项目中最低(最低 sdk)和最高(目标 sdk)级别是否有任何影响。这些东西是否会影响项目的可靠性和效率。 最佳答案 没有影响,如果您以 SDK 级别 8 为目标,那么您的应用将以 9
我将现有的 android 项目升级到 API 级别 31。我使用 Java 作为语言。我改变了 build.gradle compileSdkVersion 31 defaultConfig {
我正在使用 ionic 3 创建一个 android 应用程序,当我尝试上传到 playstore 时,我收到一个错误,提示我的应用程序以 api 25 为目标,当我检查我的 project.prop
我刚刚尝试将应用程序的目标和编译 API 级别更新为 29 (Android 10),并注意到我无法再编译,因为 LocationManager.addNmeaListener 只接受 OnNmeaM
我的代码没有在 Kitkat 上显示工具栏。 这是我的两个 Android 版本的屏幕截图。 Kitkat 版本: Lollipop 版: 这背后的原因可能是什么。 list 文件
我正在构建面向 API 级别 8 的 AccessabilityService,但我想使用 API 级别 18 中引入的功能 (getViewIdResourceName())。这应该可以通过使用 A
当我想在我的电脑上创建一个 android 虚拟机时,有两个选项可以选择目标设备。它们都用于相同的 API 级别。那么我应该选择哪一个呢?它们之间有什么区别? 最佳答案 一个是基本的 Android,
当我选择 tagret 作为 Android 4.2.2(API 级别 17)时,模拟器需要很长时间来加载和启动。 所以我研究它并通过使用 找到了解决方案Intel Atom(x86) 而不是 ARM
我有一个使用 Android Studio 创建的 Android 项目。我在项目中添加了一些第三方依赖项,但是当我尝试在 Android Studio 中编译时,我遇到了以下错误: Error:Ex
如上所述,如何使用 API 8 获取移动设备网络接口(interface)地址? 最佳答案 NetworkInterface.getInetAddresses() 在 API8 中可用。 关于andr
我想显示 Snackbar并使用图像而不是文本进行操作。 我使用以下代码: val imageSpan = ImageSpan(this, R.drawable.star) val b
我有一个用 python 编写的简单命令行程序。程序使用按以下方式配置的日志记录模块将日志记录到屏幕: logging.basicConfig(level=logging.INFO, format='
使用下面的代码,实现游戏状态以控制关卡的最简单和最简单的方法是什么?如果我想从标题画面开始,然后加载一个关卡,并在完成后进入下一个关卡?如果有人能解释处理这个问题的最简单方法,那就太好了! impor
我想创建一个可以找到嵌套树结构深度的属性。下面的静态通过递归找出深度/级别。但是是否可以将此函数作为同一个类中的属性而不是静态方法? public static int GetDepth(MenuGr
var myArray = [{ title: "Title 1", children: [{ title: "Title 1.1", children: [{
通过下面的代码,实现游戏状态来控制关卡的最简单、最容易的方法是什么?如果我想从标题屏幕开始,然后加载一个关卡,并在完成后进入下一个关卡?如果有人可以解释处理这个问题的最简单方法,那就太好了! impo
我有一个树结构,其中每个节点基本上可以有无限个子节点,它正在为博客的评论建模。 根据特定评论的 ID,我试图找出该评论在树中的深度/级别。 我正在关注 this guide that explains
考虑任何给定的唯一整数的数组,例如[1,3,2,4,6,5] 如何确定“排序度”的级别,范围从 0.0 到 1.0 ? 最佳答案 一种方法是评估必须移动以使其排序的项目数量,然后将其除以项目总数。 作
我如何定义一个模板类,它提供一个整数常量,表示作为输入模板参数提供的(指针)类型的“深度”?例如,如果类名为 Depth,则以下内容为真: Depth::value == 3 Depth::value
我的场景是:文件接收器应该包含所有内容。另一个接收器应包含信息消息,但需要注意的是 Microsoft.* 消息很烦人,因此这些消息应仅限于警告。两个sink怎么单独配置?我尝试的第一件事是: str
我是一名优秀的程序员,十分优秀!