我需要验证日志信息(错误消息)以及结果集。在我的情况下,日志记录也可以理解为生成报告。
我应该将日志消息(是否有任何错误)与结果一起存储,并在业务逻辑步骤之后进行日志记录
优势:
缺点
我应该在执行业务逻辑的同时进行日志记录
优势
缺点
下面的更多上下文:
我正在构建此工具,用于比较两个资源类型(Python中的JSON,属性,VM,REST API等)的属性。
该工具读取元数据json,其结构如下:
{
"run-name": "Run Tests"
"tests": [
{
"name": "Test 1",
"checks":[
{
"name": "Dynamic Multiple",
"type": "COMPARE",
"dynamic": [
{
"file": "source.json",
"type": "JSON",
"property": "topology.wlsClusters.[].clusterName"
}
],
"source": {
"file": "source.json",
"type": "JSON",
"property": "topology.wlsClusters.[clusterName == ${1}].Xms"
},
"target": {
"file": "target.properties",
"type": "PROPERTY",
"property": "fusion.FADomain.${1}.default.minmaxmemory.main",
"format": "-Xms{}?"
}
},
]
}
]
}
上面的JSON告诉我的工具:
可以直观地将JSON上方的对象映射为:
现在理想情况下,我知道我应该执行以下步骤:
因此,我大致上可以执行以下步骤:
我还想以以下格式打印日志。
[<TIMESTAMP> <RUN-NAME> <TEST-NAME> <CHECK-NAME> <ERROR-LEVEL> <MESSAGE-TYPE> <RESOURCE-NAME>] custom-msg
其中
ERROR-TYPE: INFO DEBUG etc
MESSAGE-TYPE: COMPARE, SYNATAX-ERROR, MISSING-PROPERTY etc
现在,如果我遵循上面的对象模型,并且每个对象都负责处理自己的日志记录,那么它将没有所有这些信息。所以我需要:
我喜欢第二种方法,因为这样我就可以存储获取的结果,并将日志记录(如果有的话)延迟到比较之后。这样,我也可以在验证错误消息(负面情况)时运行验证(单元测试)。
但这是我的解决方案越来越复杂的地方。
注意:这是用Python开发的。 (如果对您来说很重要。)
答案 0 :(得分:0)
每个类都应负责自己的状态。当您让类根据其他类的属性做出决策时,最终将得到spagetti代码。
if (test.check.resource.AProperty == aValue)
之类的代码清楚地表明您的意大利面已经开始烹饪。
在这种情况下,您想全部登录类。您希望o决定一系列操作是否成功完成。 因此,您想要记录结果。
请记住,不要让类完全记录日志,而只能报告他们测试/检查的内容以及结果。
一种常见的方法是提供一个用于接收结果的上下文对象。
以下是一些C#代码来说明(我不太了解python):
interface VerifierContext
{
void AddSuccess(string checkName, string resourceName, string message);
void AddFailure(string checkName, string resourceName, SomeEnum failureType, string message);
}
public class SomeChecker
{
public void Validate(VerifierContext context)
{
context.AddFailure("CompanyNameLength", "cluster.Company", SomeEnum.LengthRestriction, "Company name was 30chars, can only be 10");
}
}
这将为您提供一个简单的验证清单。如果要嵌套,可以添加Enter / Exit方法:
public class SomeChecker
{
public void Validate(VerifierContext context)
{
context.Enter("CompanyValidations");
foreach (var validator in _childValidators)
validator.Validate(context);
context.Exit("CompanyValidations");
}
}
您当然可以用很多不同的方法来设计它。我的主要观点是您的检查/解析器中的每个类都应该决定是否一切正常。它不应该决定如何记录事物。
然后,触发工作的类可以遍历所有结果并根据errorType等选择日志级别。
所有类都仅取决于上下文,因此也易于测试。