Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/288.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用.NET将日志写入XML文件_C#_Xml - Fatal编程技术网

C# 使用.NET将日志写入XML文件

C# 使用.NET将日志写入XML文件,c#,xml,C#,Xml,我正在将日志存储在xml文件中 在传统的纯文本格式方法中,通常只有一个openFile。。。然后写线法 如何向xml文档结构中添加新条目,就像使用文本文件方法一样?使用XmlWriter 示例代码: public class Quote { public string symbol; public double price; public double change; public int volume; }

我正在将日志存储在xml文件中

在传统的纯文本格式方法中,通常只有一个openFile。。。然后写线法

如何向xml文档结构中添加新条目,就像使用文本文件方法一样?

使用XmlWriter

示例代码:

    public class Quote
    {
        public string symbol;
        public double price;
        public double change;
        public int volume;
    }


    public void Run()
    {
        Quote q = new Quote
            {
                symbol = "fff",
                price = 19.86,
                change = 1.23,
                volume = 190393,
                };
        WriteDocument(q);
    }



    public void WriteDocument(Quote q) 
    {
        var settings = new System.Xml.XmlWriterSettings
            {
                OmitXmlDeclaration = true,
                Indent= true
            };

        using (XmlWriter writer = XmlWriter.Create(Console.Out, settings))
        {
            writer.WriteStartElement("Stock");
            writer.WriteAttributeString("Symbol", q.symbol);
            writer.WriteElementString("Price", XmlConvert.ToString(q.price));
            writer.WriteElementString("Change", XmlConvert.ToString(q.change));
            writer.WriteElementString("Volume", XmlConvert.ToString(q.volume));
            writer.WriteEndElement();
        }
    }
示例输出:

<Stock Symbol="fff">
  <Price>19.86</Price>
  <Change>1.23</Change>
  <Volume>190393</Volume>
</Stock>

19.86
1.23
190393

查看更多信息。

最大的区别在于您对日志数据的思考方式。在纯文本文件中,您实际上只是添加新行。然而,XML是一种树形结构,您需要这样考虑。您要添加的可能是另一个节点,即:

<log>
   <time>12:30:03 PST</time>
   <user>joe</user>
   <action>login</action>
<log>

太平洋标准时间12:30:03
乔
登录

因为它是一棵树,所以您需要问的是您要将这个新节点添加到哪个父节点。这通常都是在DTD中定义的(也就是如何定义数据结构)。希望这比使用什么库更有帮助,因为一旦您理解了这一原则,库的界面应该更有意义

没有更多关于你在做什么的信息,我只能提供一些基本的建议来尝试

大多数XML对象上都有一个名为“AppendChild”的方法。您可以使用此方法添加创建的带有日志注释的新节点。此节点将显示在项目列表的末尾。您可以使用所有日志节点所在位置的父元素作为要调用的对象


希望有帮助。

XML需要一个文档元素(基本上是文档开头和结尾的顶级标记)。 这意味着格式良好的XML文档需要有开头和结尾,这听起来不太适合日志,因为日志的当前“结尾”是不断扩展的

除非你编写成批的自给日志,在短时间内你把所有的东西都记录到一个文件中,否则我会考虑XML以外的其他东西。


如果您正在编写一个已完成的工作单元的日志,或者在整个工作完成之前不需要检查的日志,您可以使用您的方法—只需打开文件,编写日志行,在完成工作单元后关闭文件。

为什么要重新发明轮子?使用。

编辑xml文件时,也可以使用LINQ。您可以在此处查看如何:

以XML格式编写日志文件的一个问题是,不能只在文件末尾追加行,因为最后一行必须有一个结束根元素(XML才有效)

菲利普德沃斯的这篇博文展示了一个很好的解决方案:
高性能写入XML日志文件(编辑:链接现已失效,因此已删除)

基本上,您有两个XML文件使用XML include链接在一起:

头文件:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log [
<!ENTITY loglines SYSTEM "loglines.xml">
]>
<log>
&loglines;
</log>

&对数线;
行文件(在本例中,命名为loglines.xml):


然后可以将新行附加到“行文件”,但是(大多数)XML解析器将能够打开头文件并正确读取行


菲利普指出:这个星球上的每个XML解析器都不会正确解析这个XML。但是我使用过的所有解析器都能正确地执行此操作。

很抱歉为旧线程发布了一个答案。我很久以前就有了同样的想法。在这里,我想分享我在xml文件date-wise中保存的日志数据的完整代码

记录器类代码 以这种方式呼叫或使用
请允许我的代码帮助您和其他人:)

-1不实现using块和不使用XmlWriter.Create。如果结束,则表示没有发生异常。即使发生异常,using也将调用Dispose。你快到了。我想你很快就会得到我的支持。断开的链接,网站不再存在其他好的日志url使用一个现成的链接。
<logline date="2007-07-01 13:56:04.313" text="start process" />
<logline date="2007-07-01 13:56:25.837" text="do something" />
<logline date="2007-07-01 13:56:25.853" text="the end" />
using System.IO;
using System.Xml;
using System.Threading;

public class BBALogger
    {
        public enum MsgType
        {
            Error ,
            Info 
        }

        public static BBALogger Instance
        {
            get
            {
                if (_Instance == null)
                {
                    lock (_SyncRoot)
                    {
                        if (_Instance == null)
                            _Instance = new BBALogger();
                    }
                }
                return _Instance;
            }
        }

        private static BBALogger _Instance;
        private static object _SyncRoot = new Object();
        private static ReaderWriterLockSlim _readWriteLock = new ReaderWriterLockSlim();

        private BBALogger()
        {
            LogFileName = DateTime.Now.ToString("dd-MM-yyyy");
            LogFileExtension = ".xml";
            LogPath= Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location) + "\\Log";
        }

        public StreamWriter Writer { get; set; }

        public string LogPath { get; set; }

        public string LogFileName { get; set; }

        public string LogFileExtension { get; set; }

        public string LogFile { get { return LogFileName + LogFileExtension; } }

        public string LogFullPath { get { return Path.Combine(LogPath, LogFile); } }

        public bool LogExists { get { return File.Exists(LogFullPath); } }

        public void WriteToLog(String inLogMessage, MsgType msgtype)
        {
            _readWriteLock.EnterWriteLock();
            try
            {
                LogFileName = DateTime.Now.ToString("dd-MM-yyyy");

                if (!Directory.Exists(LogPath))
                {
                    Directory.CreateDirectory(LogPath);
                }

                var settings = new System.Xml.XmlWriterSettings
                {
                    OmitXmlDeclaration = true,
                    Indent = true
                };

                StringBuilder sbuilder = new StringBuilder();
                using (StringWriter sw = new StringWriter(sbuilder))
                {
                    using (XmlWriter w = XmlWriter.Create(sw, settings))
                    {
                        w.WriteStartElement("LogInfo");
                        w.WriteElementString("Time", DateTime.Now.ToString());
                        if (msgtype == MsgType.Error)
                            w.WriteElementString("Error", inLogMessage);
                        else if (msgtype == MsgType.Info)
                            w.WriteElementString("Info", inLogMessage);

                        w.WriteEndElement();
                    }
                }
                using (StreamWriter Writer = new StreamWriter(LogFullPath, true, Encoding.UTF8))
                {
                    Writer.WriteLine(sbuilder.ToString());
                }
            }
            catch (Exception ex)
            {

            }
            finally
            {
                _readWriteLock.ExitWriteLock();
            }
        }

        public static void Write(String inLogMessage, MsgType msgtype)
        {
            Instance.WriteToLog(inLogMessage, msgtype);
        }
    }
    BBALogger.Write("pp1", BBALogger.MsgType.Error);
    BBALogger.Write("pp2", BBALogger.MsgType.Error);
    BBALogger.Write("pp3", BBALogger.MsgType.Info);
    MessageBox.Show("done");