はじめまして!
今困ってるのが、
JAVAのプログラムでSolarisにイベントログというかSolarisのシステムログに
出力する方法が分かりません。
そもそもログ出力ができるのかどうかもわからないので
「できる! できない!」だけでも教えていただければと
思います。

ではでは、よろしくお願いします。

このQ&Aに関連する最新のQ&A

A 回答 (2件)

Java なので UNIX でしか使えない機能を組みこんではいないと思いますが。


(ちょっと探してみましたがそれらしいのは見つかりませんでした)

で、 syslog だったら logger コマンドを Runtime#exec() で動かせば
良いんじゃないですか? これなら Linux などにもありますし、もし
Windows 系の OS などの logger コマンドのない OS へ移植する事に
なったとしても logger コマンドを作るだけで済むので楽だと思います。

コマンドの詳細については man logger で見てください。
    • good
    • 0
この回答へのお礼

ありがとうございます!!!
実は、こういった質問の投稿とかって初めてだったんで、
こんな早く返事がもらえてかなり感激です!

僕もJAVAなのでそういったAPIはないと思ったんですけど、
同じSunだからもしかして。。。、と探していたんですけど、
やっぱりないですよねー

>logger コマンドを Runtime#exec() で動かせば
良いんじゃないですか?

僕は初心者とそんな変わらないんであれなんですが、Cとかで
バッチをつくるということですよね?
では、ぜひそうさせていただきます。

本当にどうもありがとうございました。

お礼日時:2001/01/17 20:28

> 僕は初心者とそんな変わらないんであれなんですが、Cとかで


> バッチをつくるということですよね?

ちょっと違います。 logger コマンドを Java から動かすのです。
java.lang.Runtime のドキュメントを見て下さい。
http://java.sun.com/j2se/1.3/ja/docs/ja/api/java …

GNU の logger コマンドのマニュアルページはこれです(Solaris のやつとは少し違います)。
http://www.linux.or.jp/JM/html/util-linux/man1/l …

それで、たとえばこんな感じになります。
Runtime.getRuntime().exec("logger hello");

注) 事前に /etc/syslog.conf の設定をしておく必要があります。
    • good
    • 0
この回答へのお礼

お礼を言うのが遅くなりましてすいません。
おかげさまで何とかなりそうです。

本当にありがとうございました。

お礼日時:2001/01/23 13:13

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aと関連する良く見られている質問

QJava ログ出力方法

バッチプログラムを作成中なのですが、ログの出し方で悩んでいます。
ログファイルを「バッチID」と「処理日付」の組み合わせで動的に変更したいと思っています。
また、ログは各クラスで出力したいと思っています。
悩んでいる箇所は
・どのようにしてバッチIDを動的に取得してログファイル名として設定するか
・複数のパッケージのクラスを使用するバッチの一連の処理をどのようにして一つのログファイルに出力するか
の2点あり、対応方法が検討もつかない状態です。

使用しているライブラリはlog4j 1.2.16.jarです。

アドバイスをいただけないでしょうか。
よろしくお願いいたします。


例として、下記のようなバッチを考えています。
foo.bar.mainパッケージにはpublic static void main(String[] args)のメソッドをもつクラスを配置します。
foo.bar.commonパッケージにはfoo.bar.mainに配置したクラスから共通で利用する処理を実装したクラスを配置します。

foo.bar.main
+- Batch1.class
+- Batch2.class




foo.bar.common
+- Common1.class
+- Common2.class
+- Common3.class




処理の流れで言うと、
Batch1を実行する場合
1. javaコマンドでBatch1実行、Batch1クラスでログを出力
2. Batch1からCommon1クラスのメソッドを実行、Common1クラスでログを出力
3. Batch1からCommon2クラスのメソッドを実行、Common2クラスでログを出力
4. 処理終了
ログは「Batch1_20120612.log」に全て出力される。

Batch2を実行する場合
1. javaコマンドでBatch2実行、Batch2クラスでログを出力
2. Batch2からCommon1クラスのメソッドを実行、Common1クラスでログを出力
3. Batch2からCommon3クラスのメソッドを実行、Common3クラスでログを出力
4. 処理終了
ログは「Batch2_20120612.log」に全て出力される。

バッチプログラムを作成中なのですが、ログの出し方で悩んでいます。
ログファイルを「バッチID」と「処理日付」の組み合わせで動的に変更したいと思っています。
また、ログは各クラスで出力したいと思っています。
悩んでいる箇所は
・どのようにしてバッチIDを動的に取得してログファイル名として設定するか
・複数のパッケージのクラスを使用するバッチの一連の処理をどのようにして一つのログファイルに出力するか
の2点あり、対応方法が検討もつかない状態です。

使用しているライブラリはlog4j 1.2.16.jar...続きを読む

Aベストアンサー

Batch1と、Batch2の呼び出すバッチファイルが別ならば、それぞれのlog4j.properties を作成して -Dlog4j.configuration オプションで起動してあげればいいです。
同じバッチからの呼び出しなら、専用のAppendarを作るしかないですね。

QJava EE同時ログ出力の衝突疑問?

こんにちはJsp+servlet+beanでWEBアプリを作っていますが、
WEBの性質上同時アクセスがあった場合、それぞれがログファイルに書き込もうとして、ログファイルがぐちゃぐちゃになりませんか?
シーケンシャル処理(セッションAのログ出力完了後セッションBが出力する)はどうやって実現できますか?
なんらかの原因でセッションのログ処理が永遠に終わらない場合、その他のログ出力セッションは待たされますか?(業務が停止すると困るので・)

Log4jを使う予定ですが、上記の問題を解決できますか?
ありがとうございます。m-.-m

Aベストアンサー

質問を具体的に書くとこういうことかしら?

Log.debug("start user:" + user);
Log.debug("end user:" + user);

こんなコードがあったとする。
AさんとBさんがアクセスしたときに期待される出力は
start user:A
end user:A
start user:B
end user:B
だけど、しかし、次のようになることもある。
start user:A
start user:B
end user:A
end user:B

確かに普通に発生する現象ね。
一番単純な考え方は、処理が終了するまではログをバッファリングしておいて
最後のときにまとめて出力
て言うやり方よね。
イメージ的には次な感じ。
buffer.append("start user:" + user);
buffer.append("end user:" + user);
Log.debug(buffer);

QJavaでlog4jを使ってログ出力を行っています。

Javaでlog4jを使ってログ出力を行っています。
環境は以下の通りです。

j2sdk1.4.2
log4j1.2.8

log4j.xml内で指定したログファイル(test.log)を別のアプリで開いた状態で
Javaプログラムを実行するとコンソールに以下のエラーが出力されます。

【エラー発生処理】
DOMConfiturator.configure(log4j.xml);

【エラー内容】
log4j:ERROR setFile(null, true) call failed
java.io.FileNotFoundException : test.log(プロセスはファイルにアクセスできません。
別のプロセスが使用中です。)

ファイルを開いているために書き込めず、エラーになってしまうのは良いのですが、
ログを出力しないだけで処理自体は続行してしまいます。
(ログを書き込めなかったらそこで処理を終了したいです。)

「書き込めなかった場合に例外をcatchする」等のことは可能でしょうか?

Aベストアンサー

FileAppender#activateOptionsの中で、
ログ出力先ファイルtest.logをopenするときにIOExceptionが発生しても、
errorログを出力するだけで、呼び出し元に例外を伝搬しないため、
処理が停止せず、そのまま続行してしまうという動きになるようです。

なので、この部分を書き換えたMyFileAppenderを定義して、
設定ファイルlog4j.xml内のFileAppenderの代わりに設定してあげれば、
「書き込めなかった場合に例外をcatchする」ことは出来るようです。
無理やりですが。。

■MyFileAppender.java
import org.apache.log4j.FileAppender;
import org.apache.log4j.helpers.LogLog;

public class MyFileAppender extends FileAppender
{
public
void activateOptions() {
if(fileName != null) {
try {
setFile(fileName, fileAppend, bufferedIO, bufferSize);
}
catch(java.io.IOException e) {
// errorメッセージを表示せず、Errorをスローするよう変更。
//errorHandler.error("setFile("+fileName+","+fileAppend+") call failed.",
// e, ErrorCode.FILE_OPEN_FAILURE);
throw new MyFileAppenderInitializeError(e);
}
} else {
//LogLog.error("File option not set for appender ["+name+"].");
LogLog.warn("File option not set for appender ["+name+"].");
LogLog.warn("Are you using FileAppender instead of ConsoleAppender?");
}
}
}

■MyFileAppenderInitializeError.java
public class MyFileAppenderInitializeError extends Error
{
public MyFileAppenderInitializeError(Throwable cause)
{
super(cause);
}
}

■log4j.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j='http://jakarta.apache.org/log4j/'>
<appender name="A1"
class="MyFileAppender">
<param name="File" value="sample.log" />
<layout class="org.apache.log4j.SimpleLayout"/>
</appender>

<root>
<priority value="DEBUG"></priority>
<appender-ref ref="A1" />
</root>
</log4j:configuration>

■呼び元クラス
import org.apache.log4j.Logger;

public class Log4jFileAppenderErrorTest
{
public static void main(String[] args)
{
try
{
Logger logger = Logger.getLogger(Log4jFileAppenderErrorTest.class);

System.out.println("Hello, Java World!");
}
catch(MyFileAppenderInitializeError e)
{
System.out.println("catch erro

FileAppender#activateOptionsの中で、
ログ出力先ファイルtest.logをopenするときにIOExceptionが発生しても、
errorログを出力するだけで、呼び出し元に例外を伝搬しないため、
処理が停止せず、そのまま続行してしまうという動きになるようです。

なので、この部分を書き換えたMyFileAppenderを定義して、
設定ファイルlog4j.xml内のFileAppenderの代わりに設定してあげれば、
「書き込めなかった場合に例外をcatchする」ことは出来るようです。
無理やりですが。。

■MyFileAppender.java
import org.apache....続きを読む

Q[log4j]ログ出力クラスでのメソッド名出力方法

お世話になっております。
現在log4jを使用したログの出力を検討しております。
その中で1点質問させてください。
Javaの初心者のため、質問がわかりにくいかもしれません。
申し訳ございません。

【質問】
クラスAのinit処理の中でログ出力用クラスBをインスタンス化し、
クラスAのメソッドCの中で、ログ出力用クラスBのログ出力メソッドDを実行することでログ出力させる方法を考えております。
ここでメソッドDで出力させるログの中にメソッドCの名前を出力させたいのですが、
方法がわかりません。
わかる方、教えていただけないでしょうか。

よろしくお願いいたします。

Aベストアンサー

あぁ、そうですね。そうなってしまいますよね。
この形でログ出力を行うならば、出力メッセージにメソッド名を追加するしかないのではないでしょうか?
メソッドDを呼び出したメソッド名(この場合ならメソッドC)を取得するには
Thread.currentThread().getStackTrace()[1].getMethodName();
とすればいいようです。
ただ、そんなに軽い処理ではないので気をつけてください。

もしくは呼び出し元でメソッド名を文字列として渡すかですね。
メンテナンスが面倒ですが、こちらのほうが処理は軽いです。

QJavaのプログラムで文字が出力できません

Javaについて勉強中です。

Java SE Development Kit 7u6というものをoracleのサイトがらダウンロードし、インストールしました。

>javac -versionと入力すると
javac 1.7.0_06

>java -versionだと
java version "1.7.0_06"
Java(TM) SE Runtime Environment (build 1.7.0_06-b24)
Java HotSpot(TM) Client VM (build 23.2-b09, mixed mode, sharing)

と表示されるのでインストールはうまくできていると思うのですが、
class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello World!!");
}
}
をtest.javaで保存し、javac test.javaと入力してもコマンドプロンプトには何も表示されません。

なぜでしょうか?教えてくださいm(_ _)m

Javaについて勉強中です。

Java SE Development Kit 7u6というものをoracleのサイトがらダウンロードし、インストールしました。

>javac -versionと入力すると
javac 1.7.0_06

>java -versionだと
java version "1.7.0_06"
Java(TM) SE Runtime Environment (build 1.7.0_06-b24)
Java HotSpot(TM) Client VM (build 23.2-b09, mixed mode, sharing)

と表示されるのでインストールはうまくできていると思うのですが、
class HelloWorld {
public static void main(String[] args) {
System.out.pr...続きを読む

Aベストアンサー

javacはプログラムをコンパイルしただけです。
フォルダ内を見ると、コンパイルされたファイルが
出来上がっていませんか?

その後に、java testと打って下さい。


人気Q&Aランキング

おすすめ情報