[.NET] [Log4net] FileAppender + MinimalLock solve performance problems (b) (the MSMQ)

In order to avoid multiple Process log file is written to the same file locking triggered the emergence log or overwriting each other's missing question, Previous use Buffer to solve this one with MSMQ.


Over 2 years ago to participate in education and training a domestic airline system conversion project, then log architect planning to use it MSMQ.

Each ap will log writes his MSMQ, and then separate Log Server to collect every once in a while, so that you can becentralized log management, But also eliminatesTemporary breakdown in communicationsThe problem.

1. First To enable Windows MSMQ and the establishment of MSMQ Private Queue, you can refer to the following two:

[Powershell] Enabling Windows Server MSMQ function (message queue)

[Powershell] establish the MSMQ (Message Queuing) set

Suppose we have established in accordance with the above name for the private queue logqueue

2.log4net have a sample code can be used msmq

Before opening a Visual Studio project, add a class:  MsmqAppender.cs

#region Apache License
//
// Licensed to the Apache Software Foundation (ASF) under one or more 
// contributor license agreements. See the NOTICE file distributed with
// this work for additional information regarding copyright ownership. 
// The ASF licenses this file to you under the Apache License, Version 2.0
// (the "License"); you may not use this file except in compliance with 
// the License. You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
#endregion

using System;
using System.Messaging;

using log4net.Core;

namespace Appender
{
	/// 
	/// Appender writes to a Microsoft Message Queue
	/// 
	/// 
  
  
   
   
	/// This appender sends log events via a specified MSMQ queue.
	/// The queue specified in the QueueName (e.g. .Private$log-test) must already exist on
	/// the source machine.
	/// The message label and body are rendered using separate layouts.
	/// 
  
  
	public class MsmqAppender : log4net.Appender.AppenderSkeleton
	{
		private MessageQueue m_queue;
		private string m_queueName;
		private log4net.Layout.PatternLayout m_labelLayout;

		public MsmqAppender()
		{
		}

		public string QueueName
		{
			get { return m_queueName; }
			set { m_queueName = value; }
		}

		public log4net.Layout.PatternLayout LabelLayout
		{
			get { return m_labelLayout; }
			set { m_labelLayout = value; }
		}

		override protected void Append(LoggingEvent loggingEvent) 
		{
			if (m_queue == null)
			{
				if (MessageQueue.Exists(m_queueName))
				{
					m_queue = new MessageQueue(m_queueName);
				}
				else
				{
					ErrorHandler.Error("Queue ["+m_queueName+"] not found");
				}
			}

			if (m_queue != null)
			{
				Message message = new Message();

				message.Label = RenderLabel(loggingEvent);

				using(System.IO.MemoryStream stream = new System.IO.MemoryStream())
				{
					System.IO.StreamWriter writer = new System.IO.StreamWriter(stream, new System.Text.UTF8Encoding(false, true));
					base.RenderLoggingEvent(writer, loggingEvent);
					writer.Flush();
					stream.Position = 0;
					message.BodyStream = stream;

					m_queue.Send(message);
				}
			}
		}

		private string RenderLabel(LoggingEvent loggingEvent)
		{
			if (m_labelLayout == null)
			{
				return null;
			}

			System.IO.StringWriter writer = new System.IO.StringWriter();
			m_labelLayout.Format(writer, loggingEvent);

			return writer.ToString();
		}
	}
}

3. Next setting log4net.config


  
  

  
  

  
   
   
    
    
    
    
    
     
  
   
     
    
   

  
   
   
    
    
    
    
    
     
    
    
       
      
     
    
   



  
  

4. Test Program: perform 1,000 write log

private static readonly ILog Logger = LogManager.GetLogger(typeof(testLog4net));
[TestMethod]
public void TestMethod1()
{
    XmlConfigurator.Configure(new FileInfo(string.Format(@"{0}{1}",
        Directory.GetParent(Directory.GetParent(Environment.CurrentDirectory).FullName),
        "log4net.config")));
    Stopwatch sw = new Stopwatch();
    sw.Start();
    for (int i = 0; i < 1000; i++)
    {
        Logger.Debug(string.Format("this is no{0} log", i + 1));
    }
    sw.Stop();
    Console.WriteLine("总耗时(ElapsedMilliseconds) = " + sw.ElapsedMilliseconds);
}

Test results: 1,000 pen log 1.721 Miao , speed!

Private queueslogqueue there really 1,000 pen log queues

summary:

  • It is found from MQViewer, log4net log is written in xml format, and then rewritten into another time log entry json format.
  • This is a note to the log is written MSMQ, and then the next note read from the MSMQ, and then written to the Log File.

reference:

sample appender

log4net

msmq sample code

原文:大专栏  [.NET][Log4net]解决FileAppender+MinimalLock性能问题(二)(MSMQ)


Guess you like

Origin www.cnblogs.com/chinatrump/p/11512833.html