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

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

ただいまの
回答率

90.82%

  • Java

    12545questions

    Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

  • C

    3218questions

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

  • Logback

    2questions

C言語とjavaで同じログファイルにファイル出力する際に注意するべき点

解決済

回答 3

投稿 編集

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

toroleaman

score 92

javaの複数のプロセスからログ出力する際に排他制御を行うため、
Logback + SLF4Jの組み合わせでログ出力させることにしています。
C言語からもこのログファイルにログ出力する必要があり、
Logback + SLF4Jで排他制御している仕組みを使って
C言語とjavaで排他制御して、ログ出力を行いたいと
思っています。
Logback + SLF4Jがどのような仕組みを使って排他制御を行っているか
教えていただけないでしょうか。
FileChannelというクラスを使っていますが、これらをC言語で排他することが出来ないでしょうか。

C言語で排他ロックするのは、以下のような感じでしょうか。
FILE * fp;
fp=fopen("out.log","a"));
flock(fileno(fp),LOCK_EX);
lseek(fileno(fp),0,SEEK_SET);
flock(fileno(fp),LOCK_UN);//ロックの解除
fclose(fp);

FileChannelが同じような排他方法で排他ロックしていれば、C言語とJavaで排他ロックができるのですが。。

  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

質問への追記・修正、ベストアンサー選択の依頼

  • 退会済みユーザー

    退会済みユーザー

    2018/04/30 18:24

    確かにLogbackのprudentモードではFileChannelを使っているようです。FileLockのドキュメント(https://docs.oracle.com/javase/jp/9/docs/api/java/nio/channels/FileLock.html#FileLock.35ao0H)では「ロックされた領域のコンテンツにその他のプログラムからアクセスできなくなるかどうかは、システムによって決まるため未指定です。」とあります。少なくともC言語でLogback互換かつプラットフォーム非依存の排他ロックを実装するのは難しそうです。できるとすればJNIでFileChannelを呼ぶ方法ではないでしょうか。

    キャンセル

  • toroleaman

    2018/05/01 07:42

    JNIだけは、避けたかったのですが、JNIも検討してみます。ありがとうございます。

    キャンセル

  • 退会済みユーザー

    退会済みユーザー

    2018/05/01 08:28

    このページ(https://logback.qos.ch/manual/appenders_ja.html)のprudentの説明にあるサンプルコードFileLockSimulator(https://gist.github.com/2794241)が参考になりそうです。

    キャンセル

  • toroleaman

    2018/05/01 08:35

    ありがとうございます。試してみます。

    キャンセル

回答 3

checkベストアンサー

0

結局Logback+slf4j相当のものをCで書く手間がかかるし、logbackは設定によってどのようにログを出すかが変わるようですね。お勧めしません。

javaで標準入力等から受け取ったログメッセージをLogback + SLF4Jに出す小さなラッパーを書いて、それにCプログラムからログメッセージを渡すようにするのはどうでしょうか。

なお、LinuxなどUNIX系のOSであれば、複数のファイルが一つのファイルを書き込みオープンするのは出来ます。ファイルをオープンするときにO_APPENDフラグをつけておけばシステムコールレベルで交通整理してくれます。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

0

ファイルに書き込むのであれば、特別に排他制御しなくても大丈夫です
書き込みのモードでファイルをオープンしとけば、他プロセスからのファイルの書き込みオープンは失敗します。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/04/30 14:18

    なるほど。書き込みモードでファイルオープン失敗した場合は、1ミリ秒ほどスリープして、リトライでしょうか。C言語でファイルをオープンしている状態で、java(Logback + SLF4J)でログ出力しようとした場合、Logback + SLF4Jでは、リトライしているのでしょうか。それとも、エラーで終了してしまうのでしょうか。

    キャンセル

  • 2018/04/30 20:41 編集

    > 書き込みのモードでファイルをオープンしとけば、他プロセスからのファイルの書き込みオープンは失敗します。

    それはOSによるのでは?LinuxとWindowsにはそういう機能は無さそうですが。

    キャンセル

  • 2018/04/30 21:45 編集

    Windowsは失敗します。Linuxも同じ筈。(最近、見てないのでちょっと自信は無いが)
    .... 失礼しました。 エラーとならないようです。 Windowsでのオープンと混じったでしょうか? 確認します。-- Unix(Linux)環境では、fctrl()等方法はあるようでしたが、Windows環境では Win32とか必要みたいでした。不確かな情報で申し訳ありません。

    キャンセル

  • 2018/04/30 20:52

    mingw32とbcc32で確認しましたが、Windowsでも多重のfopen("~","w")は成功します。

    キャンセル

  • 2018/04/30 21:50

    Windows は OS仕様上ファイルロックをします。
    Linuxは OS仕様上ファイルロックをしません。

    だったようなきがした。
    同じログに出力するんだからフォーマット合わせてるのかなこの人

    キャンセル

  • 2018/04/30 21:55

    Cコンパイラによっては、OS機能に皮をかぶせてロックする物もあるかも知れません。

    キャンセル

  • 2018/05/01 07:49

    みなさん、回答ありがとうございます。OSは、Linuxです。C言語のファイルロック(flock)とJavaのFileChannelを使って排他制御できるか試してみるしかないのかと考えています。

    キャンセル

  • 2018/05/01 07:53

    えー、Linuxでファイル書き込みでロックがかからないんだったら、書き込みデータが輻輳すんの?
    し、しらなんだ。。

    キャンセル

  • 2018/05/01 08:09

    ちなみに、Windowsですが、ファイルOpenして失敗すれば一定時間ウェイトしてリトライさせるってことをやってますね

    キャンセル

  • 2018/05/01 08:41

    コメントを訂正します。Windowsの場合、open/fopenじゃなくて直接APIを呼べば排他モードの指定が出来ますね。open/fopenはUnix互換なので排他が掛からなかったようです。

    キャンセル

0

javaはともかくCの基礎機能では排他制御まで考慮したファイル出力ができるとは思えません。拡張ライブラリを使用するならその仕様を調べることが必要のはずです。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/04/30 21:43 編集

    ログ出力を高頻度で更新を行わないのであれば、Cの オーブン失敗、再オープン、ログ出力、クローズで十分ではないかと思います。ただ、Java(Logback+SLF4J)がどういう仕組みでログ出力しているのか分からないので、その組合せが分からないです。ちょっと調べた限りでは、共通リソースで管理しているようなので、Cの単純 オープンとの相性は無理そうな気がしますが。
    --- 失礼しました。 Cの単純Openでは排他出来なかったようです。fctrl()等の排他でした。ただ、Javaの排他との相性についてはどうかは不明ですが。

    キャンセル

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

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

関連した質問

  • 解決済

    Java Commons.netを用いたFTPクライアントについての質問

    お世話になっております。 現在、JavaでFTPアップロードを行う。 - sinsengumi血風録を参考にFTP通信を行うプログラムを作成しています。 送信中はサーバーにloc

  • 解決済

    PHPの実行処理の順序

    クライアントA,Bがあったとします。 あるサイトがあり、そのサイトでは、 アクセスされる アクセス回数(以後「カウント」)を取得 1足して保存 というように、カウントを記録

  • 解決済

    android wear(Watch)をスリープさせない方法

    android wearをつかって心拍数を取得しています.任意の時間が経過すると,wearのライフサイクルでスリープしてしまいますが,wearをスリープさせない方法はありますでしょ

  • 解決済

    Javaのファイルオブジェクトの排他処理について

    JavaのFileオブジェクトについて質問があります。 例えばクライアント側のアクションによって、一つのテキストファイルのデータを確認するという処理があったとします。 (データ

  • 解決済

    非同期処理 wait,notifyAllの使い方

    import java.util.Collections; import java.util.LinkedList; import java.util.List; import j

  • 受付中

    GitHubからLinuxサーバーにPULLするバッチ処理について

    問題:GitHubからLinuxサーバーにあるディレクトリーに自動的にリアルタイムでPullできるようにはなっていますがいくつかのディレクトリーに同時にPULLした時にプロセスの処

  • 解決済

    synchlonizedブロックについて

    Javaのsynchlonizedブロックについての質問です。 http://gomyownway.hatenablog.com/entry/2012/08/30/234602

  • 受付中

    【排他処理】JavaのReetrantLockについて

    Aスレッドが処理中にBスレッドは処理待ちにせずに、 Aが処理中である旨のエラーを返してBはスレッドを抜けさせる処理を実装する場合です。 ReentrantLockのtryL

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

  • Java

    12545questions

    Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

  • C

    3218questions

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

  • Logback

    2questions