使用 log4net 的 RichTextBoxAppender

2023-11-30

有没有办法使用 log4net 以编程方式创建 RichTextBox Appender? 换句话说,没有 xml app.config?


using System;
using System.Windows.Forms;
using System.Drawing;

using log4net;
using log4net.Core;
using log4net.Appender;
using log4net.Util;

namespace Vip.Logging
{
    /// <summary>
    /// Description of RichTextBoxAppender.
    /// </summary>
    public class RichTextBoxAppender : AppenderSkeleton
    {
        #region Private Instance Fields
        private RichTextBox richTextBox = null;
        private Form containerForm = null;
        private LevelMapping levelMapping = new LevelMapping();
        private int maxTextLength = 100000;
        #endregion

        private delegate void UpdateControlDelegate(LoggingEvent loggingEvent);

        #region Constructor
        public RichTextBoxAppender(RichTextBox myRichTextBox) : base()
        {
            richTextBox = myRichTextBox;
            containerForm = (Form)richTextBox.Parent;
        }
        #endregion

        private void UpdateControl(LoggingEvent loggingEvent)
        {
            // There may be performance issues if the buffer gets too long
            // So periodically clear the buffer
            if (richTextBox.TextLength > maxTextLength)
            {
                richTextBox.Clear();
                richTextBox.AppendText(string.Format("(Cleared log length max: {0})\n", maxTextLength));
            }

            // look for a style mapping
            LevelTextStyle selectedStyle = levelMapping.Lookup(loggingEvent.Level) as LevelTextStyle;
            if (selectedStyle != null)
            {
                // set the colors of the text about to be appended
                richTextBox.SelectionBackColor = selectedStyle.BackColor;
                richTextBox.SelectionColor = selectedStyle.TextColor;

                // alter selection font as much as necessary
                // missing settings are replaced by the font settings on the control
                if (selectedStyle.Font != null)
                {
                    // set Font Family, size and styles
                    richTextBox.SelectionFont = selectedStyle.Font;
                }
                else if (selectedStyle.PointSize > 0 && richTextBox.Font.SizeInPoints != selectedStyle.PointSize)
                {
                    // use control's font family, set size and styles
                    float size = selectedStyle.PointSize > 0.0f ? selectedStyle.PointSize : richTextBox.Font.SizeInPoints;
                    richTextBox.SelectionFont = new Font(richTextBox.Font.FontFamily.Name, size, selectedStyle.FontStyle);
                }
                else if (richTextBox.Font.Style != selectedStyle.FontStyle)
                {
                    // use control's font family and size, set styles
                    richTextBox.SelectionFont = new Font(richTextBox.Font, selectedStyle.FontStyle);
                }
            }
            richTextBox.AppendText(RenderLoggingEvent(loggingEvent));
        }

        protected override void Append(LoggingEvent LoggingEvent)
        {
            if (richTextBox.InvokeRequired)
            {
                richTextBox.Invoke(
                    new UpdateControlDelegate(UpdateControl),
                    new object[] { LoggingEvent });
            }
            else
            {
                UpdateControl(LoggingEvent);
            }
        }

        public void AddMapping(LevelTextStyle mapping)
        {
            levelMapping.Add(mapping);
        }

        public override void ActivateOptions()
        {
            base.ActivateOptions();
            levelMapping.ActivateOptions();
        }

        protected override bool RequiresLayout { get { return true; } }
    }

    public class LevelTextStyle : LevelMappingEntry
    {
        private Color textColor;
        private Color backColor;
        private FontStyle fontStyle = FontStyle.Regular;
        private float pointSize = 0.0f;
        private bool bold = false;
        private bool italic = false;
        private string fontFamilyName = null;
        private Font font = null;

        public bool Bold { get { return bold; } set { bold = value; } }
        public bool Italic { get { return italic; } set { italic = value; } }
        public float PointSize { get { return pointSize; } set { pointSize = value; } }

        /// <summary>
        /// Initialize the options for the object
        /// </summary>
        /// <remarks>Parse the properties</remarks>
        public override void ActivateOptions()
        {
            base.ActivateOptions();
            if (bold) fontStyle |= FontStyle.Bold;
            if (italic) fontStyle |= FontStyle.Italic;

            if (fontFamilyName != null)
            {
                float size = pointSize > 0.0f ? pointSize : 8.25f;
                try
                {
                    font = new Font(fontFamilyName, size, fontStyle);
                }
                catch (Exception)
                {
                    font = new Font("Arial", 8.25f, FontStyle.Regular);
                }
            }
        }

        public Color TextColor { get { return textColor; } set { textColor = value; } }
        public Color BackColor { get { return backColor; } set { backColor = value; } }
        public FontStyle FontStyle { get { return fontStyle; } set { fontStyle = value; } }
        public Font Font { get { return font; } set { font = value; } }
    }
}




public partial class MainForm : Form
{
    private static string locPath = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData);
    private static string dskPath = Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory);
    private RichTextBoxAppender rba;
    private MessageBoxAppender mba;

    public MainForm()
    {
        InitializeComponent();

        if (!Global.logger.Logger.Repository.Configured)
        {
            rba = new RichTextBoxAppender(richTextBoxLog);
            rba.Threshold = Level.All;
            rba.Layout = new PatternLayout("%date{dd-MM-yyyy HH:mm:ss.fff} %5level %message %n");
            LevelTextStyle ilts = new LevelTextStyle();
            ilts.Level = Level.Info;
            ilts.TextColor = Color.Yellow;
            ilts.PointSize = 10.0f;
            rba.AddMapping(ilts);
            LevelTextStyle dlts = new LevelTextStyle();
            dlts.Level = Level.Debug;
            dlts.TextColor = Color.LightBlue;
            dlts.PointSize = 10.0f;
            rba.AddMapping(dlts);
            LevelTextStyle wlts = new LevelTextStyle();
            wlts.Level = Level.Warn;
            wlts.TextColor = Color.Chartreuse;
            wlts.PointSize = 10.0f;
            rba.AddMapping(wlts);
            LevelTextStyle elts = new LevelTextStyle();
            elts.Level = Level.Error;
            elts.TextColor = Color.Crimson;
            elts.BackColor = Color.Cornsilk;
            elts.PointSize = 10.0f;
            rba.AddMapping(elts);

            BasicConfigurator.Configure(rba);
            rba.ActivateOptions();

            mba = new MessageBoxAppender();
            mba.Layout = new PatternLayout("%date{dd-MM-yyyy HH:mm:ss.fff} %5level %message %n");
            mba.Threshold = Level.Error;
            BasicConfigurator.Configure(mba);
            mba.ActivateOptions();

            RollingFileAppender fa = new RollingFileAppender();
            fa.AppendToFile = true;
            fa.Threshold = log4net.Core.Level.All;
            fa.RollingStyle = RollingFileAppender.RollingMode.Size;
            fa.MaxFileSize = 100000;
            fa.MaxSizeRollBackups = 3;
            fa.File = dskPath + @"\FgPleoraLog.txt";
            fa.Layout = new log4net.Layout.PatternLayout("%date{dd-MM-yyyy HH:mm:ss.fff} %5level %message (%logger{1}:%line)%n");
            log4net.Config.BasicConfigurator.Configure(fa);
            fa.ActivateOptions();
        }
    }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 log4net 的 RichTextBoxAppender 的相关文章

  • EventHandler 应该始终用于事件吗?

    我一直在愉快地使用自定义委托类型和通用编写事件Action委托类型 没有真正考虑我在做什么 我有一些很好的扩展助手Action and EventHandler这使我倾向于使用那些预定义的委托类型而不是我自己的委托类型 但除此之外 除了惯例
  • 使用 Xamarin.Forms 和 Zxing 生成 QR 码

    我在网上看到了很多关于这个的内容 旧帖子 但似乎没有什么对我有用 我正在尝试从字符串中生成二维码并将其显示在应用程序中 这就是我一开始的情况 qrCode new ZXingBarcodeImageView BarcodeFormat Ba
  • 如何使用 C# 以编程方式编辑 Power BI Desktop 文档参数或数据源?

    我有一个在 Power BI Desktop 中内置的报告模板 并保存为 pbix 或 pbit 文件 该模板使用DirectQuery SQL数据库作为数据源 而服务器地址和数据库名称被提取到参数中 还有一个参数包含一个ReportId
  • libtool 在 Ubuntu 13.04 上构建 thrift 0.9.1 时出错

    在 Ubuntu 13 04 上构建 thrift 0 9 1 支持 C C java C perl python 时出现此错误 configure 不带任何选项运行 make 不带任何选项运行 Making all in test mak
  • 为什么在 C++ 中声明枚举时使用 typedef?

    我已经很多年没有写过任何 C 了 现在我正试图重新开始 然后我遇到了这个并考虑放弃 typedef enum TokenType blah1 0x00000000 blah2 0X01000000 blah3 0X02000000 Toke
  • C# Outlook 从收件人获取 CompanyName 属性

    我目前正在使用 C 编写 Outlook 2010 AddIn 我想要的是从我从 AppointmentItem 中提取的 Recipient 对象中获取 CompanyName 属性 因此 有了 AppointmentItem 的收件人
  • 以下 PLINQ 代码没有改进

    我没有看到使用以下代码的处理速度有任何改进 IEnumerable
  • 虚拟并行端口模拟器

    在我的计算机网络课程中 我们应该通过使用本机寄存器 例如使用 outportb 等命令 来学习并行端口编程 我没有并行端口 因为我住在 2011 年 但想练习这些程序 我使用 dosbox 安装了旧的 Turboc 3 IDE 有没有一个程
  • PrivateObject 找不到属性

    我的结构基本上如下所示 abstract class A protected string Identificator get set private void DoSomething DoSomethingSpecific protect
  • 关闭整数的最右边设置位

    我只需要关闭最右边的设置位即可 我的方法是找到最右边位的位置 然后离开该位 我编写这段代码是为了这样做 int POS int n int p 0 while n if n 2 0 p else break n n 2 return p i
  • C 类型命名约定,_t 或 ALLCAPS

    我一直想知道是否有任何命名约定 例如何时对类型使用全部大写以及何时追加 t 什么时候不使用任何东西 我知道当时 K R 发布了各种有关如何使用 C 的文档 但我找不到任何相关内容 在 C 标准库类型中 t看起来漂亮占主导地位 time t
  • 编写具有多种类型的泛型扩展方法时的类型推断问题

    我正在为 IEnumerable 编写一个通用扩展方法 用于将对象列表映射到另一个映射对象列表 这就是我希望该方法的工作方式 IList
  • 如何在新窗口中打开图像或pdf文件?

    我有一个 gridview 它包含文件名和文件路径 图像和 pdf 格式文件 其中我使用了模板字段 在该字段下放置了 1 个图像按钮 单击该图像按钮 即 查看 按钮 时 我想在新窗口中打开所选文件 这是我的代码 protected void
  • 选择 asp.net CheckBoxList 中的所有项目

    ASP NET 和 C 我想要一个带有 全选 项目的复选框列表 当这个特定项目是 已选择 所有其他都将被选择 也 当选择被删除时 这个项目 也将来自所有人 其他物品 选中 取消选中 任何其他项目只会有一个 对特定项目的影响 无论选择状态如何
  • C++ 模板可以提供 N 个给定类的公共父类吗?

    我正在寻找一个 C 模板 它可以找到一组给定类的共同父级 例如 class Animal class Mammal public Animal class Fish public Animal class Cat public Mammal
  • 使用 Unity 在 C# 中发送 http 请求

    如何使用 Unity 在 C 中发送 HTTP GET 和 POST 请求 我想要的是 在post请求中发送json数据 我使用Unity序列化器 所以不需要 新的 我只想在发布数据中传递一个字符串并且能够 将 ContentType 设置
  • 如何测试某些代码在 C++ 中无法编译? [复制]

    这个问题在这里已经有答案了 可能的重复 单元测试编译时错误 https stackoverflow com questions 605915 unit test compile time error 我想知道是否可以编写一种单元测试来验证给
  • 在二进制数据文件的标头中放入什么

    我有一个模拟 可以读取我们创建的大型二进制数据文件 10 到 100 GB 出于速度原因 我们使用二进制 这些文件依赖于系统 是从我们运行的每个系统上的文本文件转换而来的 所以我不关心可移植性 当前的文件是 POD 结构的许多实例 使用 f
  • IDisposable 的显式实现

    虽然有很多关于IDisposable在 SO 上找到 我还没有找到答案 我通常遵循这样的做法 当我的一个班级拥有一个IDisposable对象然后它也实现IDisposable并打电话Dispose在拥有的对象上 然而最近我遇到了一个类 它
  • 是否可以使用 Dapper 流式传输大型 SQL Server 数据库结果集?

    我需要从数据库返回大约 500K 行 请不要问为什么 然后 我需要将这些结果保存为 XML 更紧急 并将该文件通过 ftp 传输到某个神奇的地方 我还需要转换结果集中的每一行 现在 这就是我正在做的事情 TOP 100结果 使用 Dappe

随机推荐

  • VB.NET - 鼠标坐标

    我有一个 vb net 应用程序 我想知道如何在窗体上单击鼠标时找到指针 鼠标 的坐标 没什么可说的 所以我就这样吧 D Thanks 将鼠标坐标放入文本框中的非常简单的代码 Private Sub Form1 MouseClick ByV
  • 使用 PTVS、IronPython 和 MongoDB

    我想使用 PTVS Visual Studio 的 Python 工具 开发一个应用程序 我下载了 PTVS 插件和 IronPython for Visual Studio 2012 它运行得很好 我的问题是 我可以将 MongoDB 与
  • 为什么弹性项目不会缩小到超过内容大小?

    我有 4 个 Flexbox 列 一切正常 但是当我向列添加一些文本并将其设置为大字体大小时 由于 Flex 属性 它使列比应有的宽度更宽 我尝试使用word break break word它很有帮助 但是当我将列的大小调整到非常小的宽度
  • JsonArray.Parse(...) 错误

    我正在开发一个适用于 Windows 8 的新闻应用程序 使用 C XAML 不幸的是 我在下载 JSON Feed 后遇到了一个奇怪的错误 通过验证 http jsonlint com 异步 下载成功 然后我想解析结果 var items
  • Oracle 如何列出两个日期之间的月份的最后几天

    我设法获取两个日期之间的所有天数 但我想获取两个日期之间几个月的所有最后一天 使用一个请求 2 个日期之间的所有日期 select to date 01 01 2000 dd mm yyyy LEVEL 1 as jour from dua
  • Ruby:根据整数数组对对象数组进行排序

    这看起来相当简单 之前就应该问过 但我在 Stack Overflow 上找到的所有内容似乎都不起作用 我有一个包含 4 个对象的数组 我想按特定顺序对其进行重新排序 所以 它看起来像这样 array Obj1 Obj2 Obj3 Obj4
  • 从 android studio 打开项目文件夹?

    我知道这是一个微不足道的功能 但是 Android Studio 中是否有一个选项可以将项目文件夹打开到文件资源管理器 来自 AS 附注 始终可以按照 AS 窗口标题上显示的路径导航到项目文件夹 You can press ShiftShi
  • 嵌套参考字段

    为了检索设备类型 我使用一个将检索设备模型 然后使用另一个使用设备模型的字段 typeID 引用设备类型来检索设备类型 但它显示以下警告 警告 失败的道具类型 无效的道具翻译类型选择 提供给 ReferenceField 的布尔值 预期函数
  • 使用 asyncio 时,如何在关闭事件循环之前允许所有正在运行的任务完成

    我有以下代码 asyncio coroutine def do something periodically while True asyncio async my expensive operation yield from asynci
  • 如何在Python中打印三角形?

    我想做一个打印三角形的函数 如下图所示 用户可以插入三角形的行号 第一行的总长度必须是奇数 我尝试使用下面的代码 def triangle n k 2 n 2 for i in range 0 n for j in range 0 k pr
  • 如何在 datagridview 列中动态显示数字计时器(秒表)c#?

    我有datagridview 其数据源是datatable 我在 datagridview 有两列 及时命名 加载 datagridview 后 我想添加一个名为 DURATION 的新列 它是一个计时器列 即基于 IN TIME DURA
  • 如何使用 Pandas apply() 函数对 API 进行异步调用

    我有大约 14 000 行数据框 并尝试通过调用 API 将一些数据填充到新列中 下面的代码检索预期的响应 但是 似乎每次迭代都等待响应进入下一行 这是函数 def market sector des isin isin isin isin
  • Java解析字符串到日期[重复]

    这个问题在这里已经有答案了 我正在尝试在 Java 中解析字符串以获取日期对象 我的字符串是 String date 2013 04 13 21 00 00 代码是 String myFormatString yyyy mm dd hh m
  • “else”错误之前预期的主要表达式[关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 我得到了expected primary expres
  • Javascript根据另一个下拉框值更改下拉框选项[重复]

    这个问题在这里已经有答案了 我正在练习 JavaScript 编程 我发现了一个问题 必须由一些专家来回答drop down boxes 场景是 我有一个drop down框提供了省份的一些可能选项以及第二个选项 城镇 该选项仅取决于省份中
  • 如何以层次结构显示非标准化数据?

    我的问题是我想以层次结构显示数据 如下所示 Democrat County Clerk 候选人1 候选人2 Magistrate 候选人1 候选人2 候选人3 但我正在检索这样的数据集 Party Office Candidate Demo
  • 当最终网址为 https 时,如何使用 python 取消缩短(解析)网址?

    当最终的 url 是 https 时 我希望在 python 中取消缩短 解析 一个 url 我看到过这样的问题 如何使用 python 取消缩短 URL 以及其他类似的 但是正如已接受答案的评论中所述 此解决方案仅在 url 未重定向到
  • 零填充矩阵

    我有一个 16X16 矩阵 我必须将它添加到 256X256 矩阵中 谁能帮助我如何将这个 16X16 矩阵变成 256X256 并用零填充剩余的矩阵 如果您将某些内容分配给超出原始大小的元素 Matlab 会自动用零填充 gt gt A
  • 根据下一行的格式删除换行符

    我有一个这种格式的特殊文件 title1 1 texthere title2 2 texthere 我希望将所有以 开头的换行符放置为之前行的第二列 我尝试使用 sed 和以下命令来做到这一点 sed s n g filename 但它没有
  • 使用 log4net 的 RichTextBoxAppender

    有没有办法使用 log4net 以编程方式创建 RichTextBox Appender 换句话说 没有 xml app config using System using System Windows Forms using System