2013年08月13日(火) [長年日記]
■ [hard] 落雷によりPCのLANボードが壊れた
月曜日の夕方に激しい雷雨があり、帰宅するとテレビが映らなくなっていた。5年前と同じく落雷により共用ブレーカが落ちたようで、それを上げることでテレビは復活。テレビの復旧はあの後も何度かやっていて珍しくない。
今回はそれにとどまらず、PCのネットワーク接続もできなくなっていた。ハブのランプの点き方からすると、ハブやブロードバンドルータは無事でPCのLANボードが壊れてしまったみたい。Windowsのデバイスマネージャで見るとネットワークアダプタが正しく動作していないと表示されている。
ネットワークが使えないこと以外に問題は見当たらない。落雷でLANボードが壊れて他が無事なんてことがあるのかなと思ったけど、検索すると同じような事象はよくあるようである。
■ [hard] LANボードを買った
というわけで、急遽ヨドバシカメラでバッファローのLGY-PCI-GTというLANボードを買ってきた。
1610円だった。10年前(!!)に買ったのの倍の値段だ。
少し前まではLANボードって色々売っていたと思うけど、今日のヨドバシカメラでは3種類くらいしかなく、それぞれ1,2個ずつくらいしか置いていなかった。2000円以下で買える安いLANボードは今回買ったものだけで、これは最後の1つだった。危ない。
購入したLANボードを取り付けることでPCのネットワーク接続は無事に復活した。ただし、DHCPでのIPアドレス取得はできなかった。DHCP DISCOVERに対する応答が無い。ブロードバンドルータのDHCPサーバが壊れたのかな。でもブラウザでアクセスできる管理画面ではちゃんと動いているように見える。DHCPを使わず固定のIPアドレスを割り当てれば使えるので当面問題はない。以前からDHCPは使っていなかったのかも(覚えてない)。
2013年08月26日(月) [長年日記]
■ [java] java.util.logging.Logger でログを出す
java.util.logging.Loggerを使おうとするといつも躓くのでメモ。
getGlobal()で取得できるグローバルロガーを使ってみる。使用したJavaのバージョンは 1.7.0_25。
何も設定しないと何も出力されない
次のプログラムは何も出力しない。
import java.util.logging.Logger; public class LogTest { public static void main(String[] args) { Logger.getGlobal().severe("severe"); Logger.getGlobal().info("info"); Logger.getGlobal().config("config"); Logger.getGlobal().finest("finest"); } }
setLevel(Level.ALL)を呼んでみる
Loggerオブジェクトに対しsetLevel(Level.ALL)を呼ぶようにする
import java.util.logging.Level; import java.util.logging.Logger; public class LogTest { public static void main(String[] args) { Logger.getGlobal().setLevel(Level.ALL); // <--- Logger.getGlobal().severe("severe"); Logger.getGlobal().info("info"); Logger.getGlobal().config("config"); Logger.getGlobal().finest("finest"); } }
と、INFOレベル以上のログだけが標準エラーに出力されるようになる。
8 26, 2013 7:35:14 午後 LogTest main SEVERE: severe 8 26, 2013 7:35:14 午後 LogTest main 情報: info
こうなるのは、「デフォルトの構成では、ルートロガーのハンドラの 1 つがコンソールへの出力用として設定」されているからのようだ。
setUseParentHandlers(false) を呼んでみる
Loggerオブジェクトに対しsetUseParentHandlers(false)を呼ぶようにすると、再び何も出力されなくなる。ログがルートロガーへ送られなくなるからだろう。
import java.util.logging.Level; import java.util.logging.Logger; public class LogTest { public static void main(String[] args) { Logger.getGlobal().setUseParentHandlers(false); // <--- Logger.getGlobal().setLevel(Level.ALL); Logger.getGlobal().severe("severe"); Logger.getGlobal().info("info"); Logger.getGlobal().config("config"); Logger.getGlobal().finest("finest"); } }
Loggerにハンドラを追加してみる
LoggerオブジェクトのaddHandler()を呼んでハンドラを追加する
import java.util.logging.Level; import java.util.logging.Logger; import java.util.logging.StreamHandler; public class LogTest { public static void main(String[] args) { Logger.getGlobal().setUseParentHandlers(false); Logger.getGlobal().setLevel(Level.ALL); Logger.getGlobal().addHandler(new StreamHandler() {{ // <--- setOutputStream(System.out); }}); Logger.getGlobal().severe("severe"); Logger.getGlobal().info("info"); Logger.getGlobal().config("config"); Logger.getGlobal().finest("finest"); } }
と、INFOレベル以上のログだけが(上の例だと標準出力に)出力されるようになる。
8 26, 2013 7:59:46 午後 LogTest main SEVERE: severe 8 26, 2013 7:59:46 午後 LogTest main 情報: info
ハンドラに対しsetLevel(Level.ALL)を呼んでみる
ハンドラに対してもsetLevel(Level.ALL)を呼ぶようにする
import java.util.logging.Level; import java.util.logging.Logger; import java.util.logging.StreamHandler; public class LogTest { public static void main(String[] args) { Logger.getGlobal().setUseParentHandlers(false); Logger.getGlobal().setLevel(Level.ALL); Logger.getGlobal().addHandler(new StreamHandler() {{ setOutputStream(System.out); setLevel(Level.ALL); // <--- }}); Logger.getGlobal().severe("severe"); Logger.getGlobal().info("info"); Logger.getGlobal().config("config"); Logger.getGlobal().finest("finest"); } }
と、全部のログが出力された。
8 26, 2013 8:05:55 午後 LogTest main SEVERE: severe 8 26, 2013 8:05:55 午後 LogTest main 情報: info 8 26, 2013 8:05:55 午後 LogTest main CONFIG: config 8 26, 2013 8:05:55 午後 LogTest main FINEST: finest
● 伊藤史朗 [「Loggerにハンドラを追加してみる」にて示された、サンプルソースでは、「setLevel(Level.ALL);..]
● 小川 [当時のことは何も覚えていませんが、話の流れからはLevel.ALLで合っているように思いました。 LoggerにAL..]