xBIM 日志操作

时间:2021-11-25 16:37:19

目录

一、日志操作

xBIM 使用Log4Net组件来处理错误和警告信息,同时也在xBIM 几何引擎中用于记录所有的几何错误信息,如果您发现你的几何或者模型无法加载,那么请查看日志。Log4Net 有很多配置,可以将日志输出到控制台、创建连续或滚动的日志文件。在程序解决方案配置文件 App.config,配置文件信息如下:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />
</configSections>
<log4net>
<!-- 定义默认日志操作 -->
<root>
<appender-ref ref="console" />
<!-- 设置日志等级 ALL DEBUG INFO WARN ERROR FATAL NONE -->
<level value="ALL" />
</root>
<appender name="console" type="log4net.Appender.ColoredConsoleAppender">
<mapping>
<level value="FATAL" />
<foreColor value="White" />
<backColor value="Red" />
</mapping>
<mapping>
<level value="ERROR" />
<foreColor value="Red, HighIntensity" />
</mapping>
<mapping>
<level value="WARN" />
<foreColor value="Green, HighIntensity" />
</mapping>
<mapping>
<level value="INFO" />
<foreColor value="Blue, HighIntensity" />
</mapping>
<mapping>
<level value="DEBUG" />
<foreColor value="White" />
</mapping>
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%-5level - %message [%logger %type.%method Line %line]%newline" />
</layout>
</appender>
</log4net>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2" />
</startup>
</configuration>

在开发过调试过程中可以使用控制台,但如果应用程序发布给客户电脑上,如果系统出现错误,有时候需要根据日志来筛查问题。那么我推荐使用以通过SMTP电子邮件传递日志。通过以电子邮件的形式发送到邮箱,那样下班后随时都可以查看发生的问题。当然这需要通过客户的同意,未经别人同意随意获取相关信息,,你懂得。。

<appender name="SmtpAppender" type="log4net.Appender.SmtpAppender">
<to value="to@domain.com" />
<from value="from@domain.com" />
<subject value="test logging message" />
<smtpHost value="SMTPServer.domain.com" />
<bufferSize value="512" />
<lossy value="true" />
<evaluator type="log4net.Core.LevelEvaluator">
<threshold value="WARN"/>
</evaluator>
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%newline%date [%thread] %-5level %logger [%property{NDC}] - %message%newline%newline%newline" />
</layout>
</appender>

在系统平时用的比较多的是文件记录或者数据库。

MS SERVER 数据库配置如下:

// 在数据库中创建表
CREATE TABLE [dbo].[Log] (
[Id] [int] IDENTITY (1, 1) NOT NULL,
[Date] [datetime] NOT NULL,
[Thread] [varchar] (255) NOT NULL,
[Level] [varchar] (50) NOT NULL,
[Logger] [varchar] (255) NOT NULL,
[Message] [varchar] (4000) NOT NULL,
[Exception] [varchar] (2000) NULL
)

配置文件

<appender name="AdoNetAppender" type="log4net.Appender.AdoNetAppender">
<bufferSize value="100" />
<connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<connectionString value="data source=[database server];initial catalog=[database name];integrated security=false;persist security info=True;User ID=[user];Password=[password]" />
<commandText value="INSERT INTO Log ([Date],[Thread],[Level],[Logger],[Message],[Exception]) VALUES (@log_date, @thread, @log_level, @logger, @message, @exception)" />
<parameter>
<parameterName value="@log_date" />
<dbType value="DateTime" />
<layout type="log4net.Layout.RawTimeStampLayout" />
</parameter>
<parameter>
<parameterName value="@thread" />
<dbType value="String" />
<size value="255" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%thread" />
</layout>
</parameter>
<parameter>
<parameterName value="@log_level" />
<dbType value="String" />
<size value="50" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%level" />
</layout>
</parameter>
<parameter>
<parameterName value="@logger" />
<dbType value="String" />
<size value="255" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%logger" />
</layout>
</parameter>
<parameter>
<parameterName value="@message" />
<dbType value="String" />
<size value="4000" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%message" />
</layout>
</parameter>
<parameter>
<parameterName value="@exception" />
<dbType value="String" />
<size value="2000" />
<layout type="log4net.Layout.ExceptionLayout" />
</parameter>
</appender>

二、程序中使用

使用xBIM 基础结构来记录日志消息,如下代码

using Xbim.Common.Logging;
var log = LoggerFactory.GetLogger(); 

log.Info("Examples are just about to start.");
log.Warn("Always use LINQ instead of general iterations!");
log.Error("This is how the error would be logged with log4net.");
log.Info("All examples finished.");

三、xBIM 日志高级使用

xBIM 一个有趣的方面,就是整个设计核心中,模型的每一个变化都是通过事务来实现的。IModel并且从那里被弱引用,所以当你使用using语句模型时,只要你保留它,只保留对事务的引用。这意味着有一个单一点,所有的变化正在发生,我们可以做一些事情。记录模型的所有变化,以前的状态和下一个状态,将这些所有的结合在一起,可以创建反向日志和向前日志,为了简化这个任务xBIM 实现了一个Xbim.IO.Delta.TransactionLog类。在下面的列子看我们如何使用:

using System;
using Xbim.Common;
using Xbim.Ifc;
using Xbim.Ifc4.Interfaces;
using Xbim.IO.Delta;
using Xbim.IO.Step21;
var editor = new XbimEditorCredentials
{
ApplicationDevelopersName = "You", //应用开发商名称
ApplicationFullName = "Your app", //应用程序名称
ApplicationIdentifier = "Your app ID", //应用程序标示符
ApplicationVersion = "4.0",
//您的个人信息
EditorsFamilyName = "lu",
EditorsGivenName = "yongqiang",
EditorsOrganisationName = "bim"
};
using (var model = IfcStore.Open("SampleHouse.ifc", editor, true))
{
using (var txn = model.BeginTransaction("Modification"))
{
using (var log = new TransactionLog(txn))
{
//修改墙的相关信息
var wall = model.Instances.FirstOrDefault<IIfcWall>();
wall.Name = "Unexpected name";
wall.GlobalId = Guid.NewGuid().ToPart21();
wall.Description = "New and more descriptive description"; //打印变化的日志信息
PrintChanges(log);
txn.Commit();
}
Console.WriteLine();
}
}
private static void PrintChanges(TransactionLog log)
{
foreach (var change in log.Changes)
{
switch (change.ChangeType)
{
case ChangeType.New:
Console.WriteLine(@"New entity: {0}", change.CurrentEntity);
break;
case ChangeType.Deleted:
Console.WriteLine(@"Deleted entity: {0}", change.OriginalEntity);
break;
case ChangeType.Modified:
Console.WriteLine(@"Changed Entity: #{0}={1}", change.Entity.EntityLabel, change.Entity.ExpressType.ExpressNameUpper);
foreach (var prop in change.ChangedProperties)
Console.WriteLine(@" Property '{0}' changed from {1} to {2}", prop.Name, prop.OriginalValue, prop.CurrentValue);
break;
default:
break;
}
}
}

生成的更改日志如下:

Changed Entity: #=IFCWALL
Property 'Name' changed from 'Basic Wall:Wall-Ext_102Bwk-75Ins-100LBlk-12P:285330' to 'Unexpected name'
Property 'OwnerHistory' changed from # to #
Property 'GlobalId' changed from '3cUkl32yn9qRSPvBJVyWw5' to '0zxW3$9z95n8U_H9YOcyiE'
Property 'Description' changed from $ to 'New and more descriptive description'
New entity: #=IFCOWNERHISTORY(#,#,$,.MODIFIED.,$,$,$,);
New entity: #=IFCPERSON($,'Santini Aichel','Johann Blasius',$,$,$,$,$);
New entity: #=IFCORGANIZATION($,'Independent Architecture',$,$,$);
New entity: #=IFCPERSONANDORGANIZATION(#,#,$);
New entity: #=IFCORGANIZATION($,'You',$,$,$);
New entity: #=IFCAPPLICATION(#,$,'Your app','Your app ID');