1. 程式人生 > >在WPF中,使用控制檯輸出日誌資訊

在WPF中,使用控制檯輸出日誌資訊

一、背景

之前的專案中,使用Log4NET將日誌資訊輸出到文字檔案中。這種方法適用於常看以前的日誌資訊,卻並不適用於實時檢視日誌。本以為Log4NET可以很方便地通過配置appender來解決這個問題。無奈,個人水平有限,只能夠在控制檯程式中實現,而在WPF應用中沒有解決這個問題。後來將解決方案轉win32。通過呼叫win32函式來直接輸出資訊到控制檯。

二、解決方案

幫助類

    public class ConsoleLogHelper
    {

        [System.Security.SuppressUnmanagedCodeSecurity]
        [DllImport("kernel32"
, CharSet = CharSet.Auto)] internal static extern bool AllocConsole(); [System.Security.SuppressUnmanagedCodeSecurity] [DllImport("kernel32", CharSet = CharSet.Auto)] internal static extern bool FreeConsole(); /// <summary> /// 在程式啟動時,執行一次即可 ///
</summary>
public static void OpenConsole() { try { var consoleTitle = "App Runtime Log"; AllocConsole(); Console.BackgroundColor = ConsoleColor.Black; Console.CursorVisible = false; Console.Title = consoleTitle; } catch
(Exception) { throw; } } /// <summary> /// 該方法只在退出程式時,呼叫 /// </summary> public static void CloseConsole() { FreeConsole(); } public static void WriteLine(string msg) { Console.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")); Console.WriteLine(msg); Console.ForegroundColor = ConsoleColor.White; } public static void WriteLineError(string msg) { Console.ForegroundColor = ConsoleColor.Red; WriteLine(msg); } public static void WriteLineError(Exception ex) { WriteLineError(ex.Message); } public static void WriteLineInfo(string msg) { Console.ForegroundColor = ConsoleColor.Cyan; WriteLine(msg); } }

使用 App.cs

    public partial class App : Application
    {
        protected override void OnStartup(StartupEventArgs e)
        {
            base.OnStartup(e);
            ConsoleLogHelper.OpenConsole();
        }

        protected override void OnExit(ExitEventArgs e)
        {
            base.OnExit(e);
            ConsoleLogHelper.CloseConsole();
        }
    }

使用 MainWindow.xaml

<Window x:Class="Log4Net_Appender_Console.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:Log4Net_Appender_Console"
        mc:Ignorable="d"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <StackPanel>
            <Button Click="Button_Click_default"
                    Width="200"
                    Height="50">default</Button>
            <Button Click="Button_Click_error"
                    Width="200"
                    Height="50">error</Button>
            <Button Click="Button_Click_exception"
                    Width="200"
                    Height="50">exception</Button>
            <Button Click="Button_Click_info"
                    Width="200"
                    Height="50">info</Button>

        </StackPanel>

    </Grid>
</Window>

使用 MainWindow.cs

    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private void Excute(Action<int> action)
        {
            for (int i = 0; i < 10; i++)
            {
                action(i);
            }
        }

        private void Button_Click_default(object sender, RoutedEventArgs e)
        {
            Excute((i)=> {
                Console.WriteLine($"default-->{i.ToString()}");
            });
        }

        private void Button_Click_error(object sender, RoutedEventArgs e)
        {
            Excute((i) => {
                ConsoleLogHelper.WriteLineError($"error-->{i.ToString()}");
            });
        }

        private void Button_Click_exception(object sender, RoutedEventArgs e)
        {
            try
            {
                string a = null;
                a.ToString();
            }
            catch (Exception ex)
            {
                Excute((i) => {
                    ConsoleLogHelper.WriteLineError(ex);
                });
            }
        }

        private void Button_Click_info(object sender, RoutedEventArgs e)
        {
            Excute((i) => {
                ConsoleLogHelper.WriteLineInfo($"info-->{i.ToString()}");
            });
        }
    }

三、分析

使用核心函式AllocConsole()在當前執行緒中開啟一個控制檯。然後使用Console.WriteLine()將資訊輸出到控制檯。