xBIM 日志操作
目录
一、日志操作
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: #1229=IFCWALL Property 'Name' changed from 'Basic Wall:Wall-Ext_102Bwk-75Ins-100LBlk-12P:285330' to 'Unexpected name' Property 'OwnerHistory' changed from #42 to #83873 Property 'GlobalId' changed from '3cUkl32yn9qRSPvBJVyWw5' to '0zxW3$9z95n8U_H9YOcyiE' Property 'Description' changed from $ to 'New and more descriptive description' New entity: #83873=IFCOWNERHISTORY(#83876,#83877,$,.MODIFIED.,$,$,$,0); New entity: #83874=IFCPERSON($,'Santini Aichel','Johann Blasius',$,$,$,$,$); New entity: #83875=IFCORGANIZATION($,'Independent Architecture',$,$,$); New entity: #83876=IFCPERSONANDORGANIZATION(#83874,#83875,$); New entity: #83878=IFCORGANIZATION($,'You',$,$,$); New entity: #83877=IFCAPPLICATION(#83878,$,'Your app','Your app ID');