예제 #1
0
 private static void DebugWrite(string message, LoggingData data)
 {
     foreach (string msg in data.ToStrings())
     {
         System.Diagnostics.Debug.WriteLine(message + " " + msg);
     }
 }
예제 #2
0
        /// <summary>
        /// ログ書き込み・ログバッファ消去
        /// </summary>
        /// <param name="log">ログデータ</param>
        /// <param name="logName1">ログファイル名</param>
        /// <param name="logName2">ログファイル名(リネーム用)</param>
        private static async Task WriteLogBufferToFileAsync(LoggingData log, string logName1, string logName2)
        {
            StorageFolder logFolder = await ApplicationData.Current.LocalFolder.CreateFolderAsync(Settings.Folder, CreationCollisionOption.OpenIfExists);

            if (Settings.LoggingMode == LoggingModes.Size)
            {
                // サイズチェック
                try
                {
                    StorageFile cf = await logFolder.GetFileAsync(logName1);

                    BasicProperties bprop = await cf.GetBasicPropertiesAsync();

                    if (bprop.Size > (ulong)Settings.MaxFileSizeKB * 1024)
                    {
                        // サイズオーバー
                        DebugWrite("]]>!! SIZE OVER !!");
                        try
                        {
                            StorageFile df = await logFolder.GetFileAsync(logName2);

                            await df.DeleteAsync();
                        }
                        catch (FileNotFoundException)
                        {
                            // ファイルなし
                        }
                        await cf.RenameAsync(logName2);
                    }
                }
                catch (FileNotFoundException)
                {
                    // ファイルなし
                }
            }
            else
            {
                // ファイル日付チェック
                try
                {
                    StorageFile cf = await logFolder.GetFileAsync(logName1);

                    BasicProperties bprop = await cf.GetBasicPropertiesAsync();

                    TimeSpan dtdiff    = bprop.DateModified.Subtract(log.DateTime);
                    bool     fileChear = false;
                    switch (Settings.LoggingMode)
                    {
                    case LoggingModes.Day:
                    case LoggingModes.Week:
                        // ログデータ日時とログファイル更新日時差が1日越で1周したとみなす
                        if (dtdiff.Days > 1)
                        {
                            fileChear = true;
                        }
                        break;

                    case LoggingModes.Month:
                        // ログデータ日時とログファイル更新日時差が31日越で1周したとみなす
                        if (dtdiff.Days > 31)
                        {
                            fileChear = true;
                        }
                        break;
                    }
                    if (fileChear)
                    {
                        DebugWrite("]]>!! FILE CLEAR !!");
                        StorageFile df = await logFolder.GetFileAsync(logName1);

                        await df.DeleteAsync();
                    }
                }
                catch (FileNotFoundException)
                {
                    // ファイルなし
                }
            }

            var sf = await logFolder.CreateFileAsync(logName1, Windows.Storage.CreationCollisionOption.OpenIfExists);

            DebugWrite("]]>", sf.Path, lastFilename);

            // 書き込み
            await FileIO.AppendLinesAsync(sf, new List <string>(log.ToStrings()));

            // タイムスタンプ変更
            if (Internal.DateTime.DifferenceNow.Ticks != 0)
            {
                // できません
            }

            lastFilename = sf.Path;

            WriteQueueCount--;
        }
예제 #3
0
        /// <summary>
        /// ログ書き込み・ログバッファ消去
        /// </summary>
        /// <param name="log">ログデータ</param>
        /// <param name="logName1">ログファイル名</param>
        /// <param name="logName2">ログファイル名(リネーム用)</param>
#pragma warning disable CS1998 // 非同期メソッドは、'await' 演算子がないため、同期的に実行されます
        private static async Task WriteLogBufferToFileAsync(LoggingData log, string logName1, string logName2)
#pragma warning restore CS1998 // 非同期メソッドは、'await' 演算子がないため、同期的に実行されます
        {
            Uri    appUri    = new(Path.GetDirectoryName(Core.StartupPath));
            Uri    outUri    = new(appUri, Environment.ExpandEnvironmentVariables(LoggingSettings.Folder));
            string logFolder = outUri.LocalPath;

            // フォルダー作成
            if (Directory.Exists(logFolder) == false)
            {
                Directory.CreateDirectory(logFolder);
            }

            if (LoggingSettings.LoggingMode == LoggingMode.Size)
            {
                // サイズチェック
                try
                {
                    FileInfo fi = new(logFolder + @"\" + logName1);
                    if (fi.Length > (long)LoggingSettings.MaxFileSizeKB * 1024)
                    {
                        // サイズオーバー
                        DebugWrite("]]>!! SIZE OVER !!");
                        try
                        {
                            File.Delete(logFolder + @"\" + logName2);
                        }
                        catch (FileNotFoundException)
                        {
                            // ファイルなし
                        }
                        File.Move(logFolder + @"\" + logName1, logFolder + @"\" + logName2);
                    }
                }
                catch (FileNotFoundException)
                {
                    // ファイルなし
                }
            }
            else
            {
                // ファイル日付チェック
                try
                {
                    System.DateTime fd        = System.IO.File.GetLastWriteTime(logFolder + @"\" + logName1);
                    TimeSpan        dtdiff    = fd.Subtract(log.DateTime);
                    bool            fileChear = false;
                    switch (LoggingSettings.LoggingMode)
                    {
                    case LoggingMode.Day:
                    case LoggingMode.Week:
                        // ログデータ日時とログファイル更新日時差が1日越で1周したとみなす
                        if (dtdiff.Days > 1)
                        {
                            fileChear = true;
                        }
                        break;

                    case LoggingMode.Month:
                        // ログデータ日時とログファイル更新日時差が31日越で1周したとみなす
                        if (dtdiff.Days > 31)
                        {
                            fileChear = true;
                        }
                        break;
                    }
                    if (fileChear)
                    {
                        DebugWrite("]]>!! FILE CLEAR !!");
                        File.Delete(logFolder + @"\" + logName1);
                    }
                }
                catch (FileNotFoundException)
                {
                    // ファイルなし
                }
            }

            using (FileStream fs = new(logFolder + logName1, FileMode.Append))
            {
                DebugWrite("]]>", fs.Name, _LastFilename);

                // 書き込み
                using (StreamWriter sw = new(fs, System.Text.Encoding.UTF8))
                {
                    foreach (string txt in log.ToStrings())
                    {
                        sw.WriteLine(txt);
                    }
                }

                _LastFilename = fs.Name;
            }

            // タイムスタンプ変更
            if (Jaffa.DateTime.DifferenceNow.Ticks != 0)
            {
                File.SetLastWriteTime(_LastFilename, Jaffa.DateTime.Now);
            }

            WriteTaskQueueCount--;
        }