0

「」を使用したnode.jsを使用してAPIを作成しましたWinston logger。すべてのログを書き込むために言及したファイルの所有者は「ROOT」であるため、アプリケーションが終了しました。ファイルの所有者を " my user" に変更すると、アプリケーションが動作します。したがって、私の結論は、ファイルのアクセス許可が問題であるということです。

私のウィンストンコード:

new(winston.transports.File)({
        filename: config.path,-------------------->/home/username/logsdir/logfile
        //maxsize: 1024 * 1024 * 10, // 10MB
        exitOnError: false,
        maxsize: 1024 * 1024,
        level: 'info',
        handleExceptions: true,
        levels: customLevels.levels,
        rotationFormat: function() {
            return getFormattedDate();
            function getFormattedDate() {
                var temp = new Date();
                return dateStr = padStr(temp.getFullYear()) + padStr(1 + temp.getMonth()) + padStr(temp.getDate()) + padStr(temp.getHours()) + padStr(temp.getMinutes()) + padStr(temp.getSeconds());
            }
            function padStr(i) {
                return (i < 10) ? "0" + i : "" + i;
            }
        }
    })]

Winston は例外をスローしていません。アプリケーションが終了しただけです。ファイルの所有者を確認することは可能ですか? または、ウィンストンにはこれに取り組むためのオプションがあります。私はたくさんグーグルで検索しましたが、解決策が見つかりません。これを解決するのを手伝ってください。前もって感謝します。

4

1 に答える 1

0

ウィンストンは、そのような場合に何の助けも提供していないようです。解決策は、ファイルが書き込み可能かどうかを自分で確認することです。これを行う 1 つの方法を次に示します。

var logFile;
[
    '/var/log/my-app.log',
    path.join(process.cwd(), 'my-app.log'),
    path.join('/tmp', 'my-app.log'),
]
.forEach(function (path) {
    if (logFile) { return; }
    if (fs.accessSync && fs.accessSync(path, fs.W_OK)) {
        console.log('logging to ' + path);
        logFile = path;
        return;
    }

    var fh;
    try { fh = fs.openSync(path, 'a'); }
    catch (e) {
        console.error(e.message);
        return;
    }
    console.log('logging to ' + path);
    logFile = path;
    fs.closeSync(fh);
});

これで、変数 logFile は、書き込み可能なファイルであれば、書き込み可能なファイルの名前を持ちます。

于 2015-02-13T21:47:45.340 に答える