質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.98%

  • C

    3087questions

    C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

C言語のログをファイル出力について

受付中

回答 3

投稿

  • 評価
  • クリップ 0
  • VIEW 494

hide09090909

score 44

C言語プロジェクトのログをファイルに出力する方法についてお伺いしたいです。
下記のサイトを参考に行いたいのですが、ログを出力させるディレクトリの指定をどこで行っているのかわかりません。
https://qiita.com/owaridesuyo0212/items/0758269947d34ab71904
下記がサイトに乗っているサンプルコードです。

test.c

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>

#define TEST_OK  0     /* テスト関数戻り値(正常)*/
#define TEST_NG -1     /* テスト関数戻り値(異常)*/
#define LOG_FILE     "LOG/log.txt"        /* ログディレクトリ(通常)  */
#define ERR_LOG_FILE "LOG/err_log.txt"    /* ログディレクトリ(エラー)*/

FILE *log_file;        /* 通常ログ */
FILE *err_log_file;    /* 異常ログ */

/* 関数プロトタイプ宣言 */
int test_function(int num);                    /* テスト関数        */
void LOG_PRINT(char log_txt[256], ...);        /* 通常ログ出力関数  */
void ERR_LOG_PRINT(char err_txt[256], ...);    /* エラーログ出力関数*/

int main(void)
{

        int ret = TEST_OK;
        int num = 0;

        LOG_PRINT(">>> TEST START !!! \n");

        /* テスト関数起動 */
        ret = test_function(num);
        if(ret != TEST_OK)
        {
                ERR_LOG_PRINT("test_function() NG!\n");
                LOG_PRINT("<<< TEST NG END !!!\n");
                return TEST_NG;
        }

        LOG_PRINT("<<< TEST END !!!\n");

        return TEST_OK;
}

int test_function(int num)
{

        int ret = TEST_OK;
        LOG_PRINT(">>>>>> test_function() START !!! \n");

        if(num <= 0)
        {
                ret = TEST_NG;
        }

        LOG_PRINT("<<<<<< test_func() END !!!\n");
        return ret;

}

void LOG_PRINT(char log_txt[256], ...)
{

        time_t timer;
        struct tm *date;
        char str[256];

        /* 時間取得 */
        timer = time(NULL);
        date = localtime(&timer);
        strftime(str, sizeof(str), "[%Y/%x %H:%M:%S] ", date);

        if ((log_file = fopen(LOG_FILE, "a")) == NULL) {
                ERR_LOG_PRINT("file open error!!\n");
                exit(EXIT_FAILURE);        /* エラーの場合は通常、異常終了する */
        }

        /* 文字列結合 */
        strcat(str,log_txt);

        fputs(str, log_file);
        fclose(log_file); 

        return;

}

void ERR_LOG_PRINT(char err_txt[256], ...)
{
        time_t timer;
        struct tm *date;
        char str[256];

        /* 時間取得 */
        timer = time(NULL);
        date = localtime(&timer);
        strftime(str, sizeof(str), "[%Y/%x %H:%M:%S] ", date);

        if ((err_log_file = fopen("LOG/err_log.txt", "a")) == NULL) {
                printf("ERROR !!\n");
                exit(EXIT_FAILURE);        /* エラーの場合は通常、異常終了する */
        }

        /* 文字列結合 */
        strcat(str,err_txt);

        fputs(str, err_log_file);
        fclose(err_log_file); 

        return;

}


【結果】


LOG/log.txt

[2017/05/05/17 00:05:00] >>> TEST START !!! 
[2017/05/05/17 00:05:00] >>>>>> test_function() START !!! 
[2017/05/05/17 00:05:00] <<<<<< test_func() END !!!
[2017/05/05/17 00:05:00] <<< TEST NG END !!!
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

+2

どうみてもここですよね。
コメントにも書いてますし。

#define LOG_FILE     "LOG/log.txt"        /* ログディレクトリ(通常)  */
#define ERR_LOG_FILE "LOG/err_log.txt"    /* ログディレクトリ(エラー)*/


あとERR_LOG_PRINT関数内では上記マクロを使用せずに、fopenで直接ファイル名を書いているので、ERR_LOG_FILEに置き換えた方が良いでしょう。

if ((err_log_file = fopen("LOG/err_log.txt", "a")) == NULL) {
↓
if ((err_log_file = fopen(ERR_LOG_FILE, "a")) == NULL) {

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/09/22 09:50

    ご回答ありがとうございます。
    このLogディレクトリがどこに作成されるのかわかりますか?

    キャンセル

  • 2017/09/22 09:54

    相対パスになっているので、実行したディレクトリ配下になります。
    但し、C言語の場合、自動でディレクトリは作成してくれないので、ディレクトリが無ければ作成するという処理を追加するか(mkdir関数)、あらかじめコマンドラインから作っておく必要があります(mkdirコマンド)。

    キャンセル

+1

#define LOG_FILE     "LOG/log.txt"        /* ログディレクトリ(通常)  */
#define ERR_LOG_FILE "LOG/err_log.txt"    /* ログディレクトリ(エラー)*/

ここではないでしょうか?
LOGというディレクトリの中に通常時は log.txt 、エラー時は err_log.txt というファイルが出力されるはずです。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/09/22 09:50

    ご回答ありがとうございます。
    このLogディレクトリがどこに作成されるのかわかりますか?

    キャンセル

  • 2017/09/22 09:55

    すでにttyp03さんが回答している通りです。

    キャンセル

0

記載頂いたtest.cの8行目、9行目の記載でファイルを指定しています

#define LOG_FILE     "LOG/log.txt"        /* ログディレクトリ(通常)  */
#define ERR_LOG_FILE "LOG/err_log.txt"    /* ログディレクトリ(エラー)*/

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/09/22 09:50

    ご回答ありがとうございます。
    このLogディレクトリがどこに作成されるのかわかりますか?

    キャンセル

  • 2017/09/22 09:54

    プログラム実行時のカレントディレクトリ直下にあるLOGに出力されます。
    ディレクトリの作成処理は記述されていません。
    参照ページにも下記の記載があります。
    > ※LOGディレクトリは作成済みの前提

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.98%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • C

    3087questions

    C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。