国产+高潮+在线,国产 av 仑乱内谢,www国产亚洲精品久久,51国产偷自视频区视频,成人午夜精品网站在线观看

【已解決】webman內(nèi)核日志按小時(shí)分割

fantasmic

問題描述

項(xiàng)目中內(nèi)核記錄的日志比較重要,但一天生成的內(nèi)容很多,一天一個(gè)文件大多在百兆,怎么設(shè)置成X小時(shí)1個(gè)文件呢

為此你搜索到了哪些方案及不適用的原因

沒有


找到在哪設(shè)置了,RotatingFileHandler.php里FILE_PER_DAY設(shè)置為'Y-m-d H',但這是改了源碼了,不知道在config/log.php里是怎么設(shè)置的


上面雖然找到了解決方法但是實(shí)際操作下來發(fā)現(xiàn)還是有問題,表現(xiàn)是雖然按小時(shí)生成了日志但不是每個(gè)小時(shí)的內(nèi)容都寫在相應(yīng)的文件里。比如現(xiàn)在是17點(diǎn)理應(yīng)生成一個(gè)2023-07-04 17.log的日志,實(shí)際卻是寫到了2023-07-04 11.log里,12點(diǎn)-17點(diǎn)都沒有生成相應(yīng)時(shí)間的日志,在網(wǎng)上搜索了很久沒有找到合適解決方案,也看了很久源碼,猜測是設(shè)置寫入內(nèi)存塊或文件流大小的影響,奈何水平太低改不動源碼。

既然改不了項(xiàng)目源碼,那就找外部解決方案吧,搜了下有個(gè)liunx自帶的logrotate日志轉(zhuǎn)儲工具,試了下可以滿足我的需求。

配置很簡單
1.先把FILE_PER_DAY設(shè)置為空,所有日志生成在一個(gè)文件里

class MyRotatingFileHandler extends RotatingFileHandler
{
    const FILE_PER_DAY = '';
}

2.在/etc/logrotate.d/里創(chuàng)建日志分割配置

/xxx/xxx/xxx.log{ //webman的日志路徑
    su root root
    create
    daily
    rotate 120
    dateext
    dateformat %Y-%m-%d %H
    missingok
    copytruncate //該設(shè)置必選,如果不截?cái)嘁呀?jīng)打開文件,即使已經(jīng)轉(zhuǎn)存日志,后續(xù)的日志還會寫到已分割的里面
    notifempty
}
以下是全部配置項(xiàng)
compress     通過gzip 壓縮轉(zhuǎn)儲以后的日志
nocompress   不做gzip壓縮處理
copytruncate 用于還在打開中的日志文件,把當(dāng)前日志備份并截?cái)?;是先拷貝再清空的方式,拷貝和清空之間有一個(gè)時(shí)間差,可能會丟失部分日志數(shù)據(jù)。
nocopytruncate  備份日志文件不過不截?cái)?create mode owner group 輪轉(zhuǎn)時(shí)指定創(chuàng)建新文件的屬性,如create 0777 nobody nobody
nocreate 不建立新的日志文件
delaycompress 和compress 一起使用時(shí),轉(zhuǎn)儲的日志文件到下一次轉(zhuǎn)儲時(shí)才壓縮
nodelaycompress 覆蓋 delaycompress 選項(xiàng),轉(zhuǎn)儲同時(shí)壓縮。
missingok 如果日志丟失,不報(bào)錯(cuò)繼續(xù)滾動下一個(gè)日志
errors address 轉(zhuǎn)儲時(shí)的錯(cuò)誤信息發(fā)送到指定的Email 地址
ifempty 即使日志文件為空文件也做輪轉(zhuǎn),這個(gè)是logrotate的缺省選項(xiàng)。
notifempty 當(dāng)日志文件為空時(shí),不進(jìn)行輪轉(zhuǎn)
mail address 把轉(zhuǎn)儲的日志文件發(fā)送到指定的E-mail 地址
nomail 轉(zhuǎn)儲時(shí)不發(fā)送日志文件
olddir directory 轉(zhuǎn)儲后的日志文件放入指定的目錄,必須和當(dāng)前日志文件在同一個(gè)文件系統(tǒng)
noolddir 轉(zhuǎn)儲后的日志文件和當(dāng)前日志文件放在同一個(gè)目錄下
sharedscripts 運(yùn)行postrotate腳本,作用是在所有日志都輪轉(zhuǎn)后統(tǒng)一執(zhí)行一次腳本。如果沒有配置這個(gè),那么每個(gè)日志輪轉(zhuǎn)后都會執(zhí)行一次腳本
prerotate 在logrotate轉(zhuǎn)儲之前需要執(zhí)行的指令,例如修改文件的屬性等動作;必須獨(dú)立成行
postrotate 在logrotate轉(zhuǎn)儲之后需要執(zhí)行的指令,例如重新啟動 (kill -HUP) 某個(gè)服務(wù)!必須獨(dú)立成行
daily 指定轉(zhuǎn)儲周期為每天
weekly 指定轉(zhuǎn)儲周期為每周
monthly 指定轉(zhuǎn)儲周期為每月
rotate count 指定日志文件刪除之前轉(zhuǎn)儲的次數(shù),0 指沒有備份,5 指保留5 個(gè)備份
dateext 使用當(dāng)期日期作為命名格式
dateformat .%s 配合dateext使用,緊跟在下一行出現(xiàn),定義文件切割后的文件名,必須配合dateext使用,只支持 %Y %m %d %s 這四個(gè)參數(shù)
size(或minsize) log-size 當(dāng)日志文件到達(dá)指定的大小時(shí)才轉(zhuǎn)儲,log-size能指定bytes(缺省)及KB (sizek)或MB(sizem).
當(dāng)日志文件 >= log-size 的時(shí)候就轉(zhuǎn)儲。 以下為合法格式:(其他格式的單位大小寫沒有試過)
size = 5 或 size 5 (>= 5 個(gè)字節(jié)就轉(zhuǎn)儲)
size = 100k 或 size 100k
size = 100M 或 size 100M

3.如果有每X小時(shí)或每X分分割日志需求的要創(chuàng)建crontab來執(zhí)行日志分割

//-f 強(qiáng)制模式
0 */1 * * * /usr/sbin/logrotate -f /etc/logrotate.d/webman

4.結(jié)果
中間空的時(shí)間是因?yàn)橹魅罩緵]有內(nèi)容所以不分割

2708 3 11
3個(gè)回答

tanhongbin

只能自己寫一個(gè)腳本 處理了估計(jì)

  • 暫無評論
liuxingke

日志的文件名是可以自定義的,在 config/log.php 中,你可以直接定義一個(gè)函數(shù)生成日志文件名,什么樣的格式都可以,但好像默認(rèn)都會帶有當(dāng)前日期的后綴。比如定義文件名為 runtime_path() . '/logs/webman' . date('YmdH') . '.log',生成的文件名會是 webman2023062909-2023-06-29.log

return [
    'default' => [
        'handlers' => [
            [
                'class' => Monolog\Handler\RotatingFileHandler::class,
                'constructor' => [
                    runtime_path() . '/logs/webman.log', // 定義日志文件名
                    7, //$maxFiles
                    Monolog\Logger::DEBUG,
                ],
                'formatter' => [
                    'class' => Monolog\Formatter\LineFormatter::class,
                    'constructor' => [null, 'Y-m-d H:i:s', true],
                ],
            ]
        ],
    ],
];
  • 暫無評論
yongdao35

別改源碼,不好升級。app目錄下直接建立一個(gè)MyRotatingFileHandler類

class MyRotatingFileHandler extends RotatingFileHandler
{
    const FILE_PER_DAY = 'Y-m-d H';
}

config/log.php配置里
'class' => Monolog\Handler\RotatingFileHandler::class,
改成
'class' => app\MyRotatingFileHandler::class,
reload搞定

  • 小W 2023-06-29

    正解

  • tanhongbin 2023-06-29

    這個(gè)是按照小時(shí) 打印的嘛???

  • ersic 2023-06-29

    厲害了

  • fantasmic 2023-06-30

    厲害

  • fantasmic 2023-07-04

    按小時(shí)分割是解決了,但是發(fā)現(xiàn)不是準(zhǔn)確的按小時(shí)生成日志,比如現(xiàn)在是16點(diǎn),他會把日志寫在2023-07-04 11.log里,過一會再刷新就會生成2023-07-04 16.log,中間12點(diǎn)-15點(diǎn)的日志都寫在11點(diǎn)的日志里

  • yongdao35 2023-07-04

    你得研究下monolog源碼,看它什么時(shí)候生成日志,在你的類里重寫那塊的邏輯

  • fantasmic 2023-07-14

    改不動源碼,繞路解決

  • lee23 2024-03-13

    試了一下這個(gè)方法,發(fā)現(xiàn)還是有問題,不能每個(gè)小時(shí)都生成日志文件,或者有的日志又記錄到前面小時(shí)的日志文件去了,經(jīng)研究和實(shí)踐,MyRotatingFileHandler 類復(fù)制自RotatingFileHandler類全部重寫了方法,修改命名空間和引入缺失的父類StreamHandler, 修改常量 'public const FILE_PER_DAY = 'Y-m-d-H';',然后找到類中兩處 $this->nextRotation = new \DateTimeImmutable('tomorrow'); 并改成 $this->nextRotation = new \DateTimeImmutable('now');

  • lee23 2024-03-13

    同時(shí)修改log.php配文件的constructor的第二個(gè)參數(shù),把7改成168,意思是:24 * 7 即一天24個(gè)文件,保留7天的文件

  • tanhongbin 2024-03-14

    這個(gè)參數(shù) 根本就不起作用呀,我之前測試寫2 但是 還是全部保留了

  • lee23 2024-03-14

    我的是生效的,不修改前,系統(tǒng)一直保留最近7天的日志,后來改為小時(shí)了,只保留7小時(shí)的日志,改168就生效了。我的MyRotatingFileHandler類是重寫了RotatingFileHandler類,而樓主卻是繼承了RotatingFileHandler類,不知道你是怎樣寫

  • tanhongbin 2024-03-14

    一樣的寫法 感覺不生效

  • lee23 2024-03-14

    啥叫感覺啊,你可以把public const FILE_PER_DAY = 'Y-m-d-H';改成public const FILE_PER_DAY = 'Y-m-d-H-i';每分鐘生成一個(gè)文件,還有這個(gè)$this->nextRotation = new \DateTimeImmutable('now');很關(guān)鍵,再找到getGlobPattern()方法把H,i補(bǔ)上,試一試

  • lee23 2024-03-14

    為了更好地兼容,可以加個(gè)條件

          // 原來的保留
           $this->nextRotation = new \DateTimeImmutable('tomorrow');
            $this->filenameFormat = '{filename}-{date}';
            $this->dateFormat = static::FILE_PER_DAY;
            // 加個(gè)條件判斷日期格式
            if (strpos($this->dateFormat, 'H') !== false) {
                $this->nextRotation = new \DateTimeImmutable('now');
            }
  • tanhongbin 2024-03-14

    我試試 他是否會自動刪除日志文件

  • tanhongbin 2024-03-14

    我剛才測試了 安分鐘的 'constructor' => [
    runtime_path() . '/logs/api/api.log',
    2,
    Monolog\Logger::DEBUG,
    ], 但是還是會留很多的日志文件

  • tanhongbin 2024-03-14

    是按照分鐘寫的日志 public const FILE_PER_DAY = 'Y-m-d H-i'; 正常就應(yīng)該留兩個(gè)文件 但是現(xiàn)在好幾個(gè)

  • lee23 2024-03-14

    他只會刪除相同格式的文件,也就是分鐘格式的。我的是生效的,你的不生效自己找找原因

  • lee23 2024-03-14

    你不應(yīng)該留空格,文件名留空格是大忌

  • tanhongbin 2024-03-14

    日志肯定是相同格式的呀,按照分鐘的 你留兩個(gè) 是不是兩分鐘之前的日志就被刪除了吧,但是我的不生效

  • lee23 2024-03-14

    把public const FILE_PER_DAY = 'Y-m-d H-i';的空格去掉

年代過于久遠(yuǎn),無法發(fā)表回答
??