java.util.logging.Logger 和 log4j
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/582428/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
java.util.logging.Logger and log4j
提问by JB.
I am trying to compile the code from here: http://www.brackeen.com/javagamebook/#download(Chapter 6) and am having trouble. I don't understand how java.util.logging.Logger
and log4j work together, but that seems to be the issue. The errors I get are all on the log.error()
or log.warn()
method calls.
我正在尝试从这里编译代码:http: //www.brackeen.com/javagamebook/#download(第 6 章)并且遇到了问题。我不明白java.util.logging.Logger
和 log4j如何一起工作,但这似乎是问题所在。我得到的错误都在log.error()
orlog.warn()
方法调用上。
Here is the output from NetBeans:
这是 NetBeans 的输出:
init: deps-clean: Deleting directory C:\JB\NetBeansProjects\WRServer\build Deleting directory C:\JB\NetBeansProjects\WRServer\dist clean: init: deps-jar: Created dir: C:\JB\NetBeansProjects\WRServer\build\classes Compiling 23 source files to C:\JB\NetBeansProjects\WRServer\build\classes C:\JB\NetBeansProjects\WRServer\src\com\hypefiend\javagamebook\server\GameServer.java:110: cannot find symbol symbol : method error(java.lang.String,java.lang.Exception) location: class java.util.logging.Logger log.error("error initializing ServerSocket", e); ^ C:\JB\NetBeansProjects\WRServer\src\com\hypefiend\javagamebook\server\GameServer.java:152: cannot find symbol symbol : method warn(java.lang.String) location: class java.util.logging.Logger log.warn("error during serverSocket select(): " + ioe.getMessage()); ^ C:\JB\NetBeansProjects\WRServer\src\com\hypefiend\javagamebook\server\GameServer.java:155: cannot find symbol symbol : method error(java.lang.String,java.lang.Exception) location: class java.util.logging.Logger log.error("exception in run()", e); ^ C:\JB\NetBeansProjects\WRServer\src\com\hypefiend\javagamebook\server\GameServer.java:187: cannot find symbol symbol : method error(java.lang.String) location: class java.util.logging.Logger log.error("no gamecontroller for gameNameHash: " + gameNameHash); ^ C:\JB\NetBeansProjects\WRServer\src\com\hypefiend\javagamebook\server\GameServer.java:203: cannot find symbol symbol : method error(java.lang.String) location: class java.util.logging.Logger log.error("error getting GameController directory"); ^ C:\JB\NetBeansProjects\WRServer\src\com\hypefiend\javagamebook\server\GameServer.java:223: cannot find symbol symbol : method warn(java.lang.String) location: class java.util.logging.Logger log.warn("class file does not extend GameController: " + file); ^ C:\JB\NetBeansProjects\WRServer\src\com\hypefiend\javagamebook\server\GameServer.java:238: cannot find symbol symbol : method error(java.lang.String,java.lang.Exception) location: class java.util.logging.Logger log.error("Error instantiating GameController from file: " + file, e); ^ Note: Some input files use unchecked or unsafe operations. Note: Recompile with -Xlint:unchecked for details. 7 errors BUILD FAILED (total time: 0 seconds)
Here is the code straight from the book. I have not tried to edit it yet.
这是直接来自书中的代码。我还没有尝试编辑它。
package com.hypefiend.javagamebook.server;
import com.hypefiend.javagamebook.common.*;
import com.hypefiend.javagamebook.server.controller.*;
import java.nio.channels.*;
import java.util.*;
import java.net.*;
import java.io.*;
import java.util.logging.Logger;
import org.apache.log4j.*;
/**
* GameServer.java
*
* The heart of the framework, GameServer accepts
* incoming client connections and hands them off to
* the SelectAndRead class.
* GameServer also keeps track of the connected players
* and the GameControllers.
*
* @author <a href="mailto:[email protected]">bret barker</a>
* @version 1.0
*/
public class GameServer extends Thread {
/** log4j Logger */
private Logger log = Logger.getLogger("GameServer");
/** ServerSocketChannel for accepting client connections */
private ServerSocketChannel sSockChan;
/** selector for multiplexing ServerSocketChannels */
private Selector selector;
/** GameControllers keyed by GameName */
private Hashtable gameControllers;
/** classname prefix used for dynamically loading GameControllers */
private static final String CONTROLLER_CLASS_PREFIX =
"com.hypefiend.javagamebook.server.controller.";
/** players keyed by playerId */
private static Hashtable playersByPlayerId;
/** players keyed by sessionId */
private static Hashtable playersBySessionId;
private boolean running;
private SelectAndRead selectAndRead;
private EventWriter eventWriter;
private static long nextSessionId = 0;
/**
* main.
* setup log4j and fireup the GameServer
*/
public static void main(String args[]) {
BasicConfigurator.configure();
GameServer gs = new GameServer();
gs.start();
}
/**
* constructor, just initialize our hashtables
*/
public GameServer() {
gameControllers = new Hashtable();
playersByPlayerId = new Hashtable();
playersBySessionId = new Hashtable();
}
/**
* init the GameServer, startup our workers, etc.
*/
public void init() {
log.info("GameServer initializing");
loadGameControllers();
initServerSocket();
selectAndRead = new SelectAndRead(this);
selectAndRead.start();
eventWriter = new EventWriter(this, Globals.EVENT_WRITER_WORKERS);
}
/**
* GameServer specific initialization, bind to the server port,
* setup the Selector, etc.
*/
private void initServerSocket() {
try {
// open a non-blocking server socket channel
sSockChan = ServerSocketChannel.open();
sSockChan.configureBlocking(false);
// bind to localhost on designated port
InetAddress addr = InetAddress.getLocalHost();
log.info("binding to address: " + addr.getHostAddress());
sSockChan.socket().bind(new InetSocketAddress(addr, Globals.PORT));
// get a selector
selector = Selector.open();
// register the channel with the selector to handle accepts
SelectionKey acceptKey = sSockChan.register(selector, SelectionKey.OP_ACCEPT);
}
catch (Exception e) {
log.error("error initializing ServerSocket", e);
System.exit(1);
}
}
/**
* Here's the meat, loop over the select() call to
* accept socket connections and hand them off to SelectAndRead
*/
public void run() {
init();
log.info("******** GameServer running ********");
running = true;
int numReady = 0;
while (running) {
// note, since we only have one ServerSocket to listen to,
// we don't need a Selector here, but we set it up for
// later additions such as listening on another port
// for administrative uses.
try {
// blocking select, will return when we get a new connection
selector.select();
// fetch the keys
Set readyKeys = selector.selectedKeys();
// run through the keys and process
Iterator i = readyKeys.iterator();
while (i.hasNext()) {
SelectionKey key = (SelectionKey) i.next();
i.remove();
ServerSocketChannel ssChannel = (ServerSocketChannel) key.channel();
SocketChannel clientChannel = ssChannel.accept();
// add to the list in SelectAndRead for processing
selectAndRead.addNewClient(clientChannel);
log.info("got connection from: " + clientChannel.socket().getInetAddress());
}
}
catch (IOException ioe) {
log.warn("error during serverSocket select(): " + ioe.getMessage());
}
catch (Exception e) {
log.error("exception in run()", e);
}
}
}
/**
* shutdown the GameServer
*/
public void shutdown() {
selector.wakeup();
}
/**
* Return the next available sessionId
*/
public synchronized String nextSessionId() {
return "" + nextSessionId++;
}
/**
* finds the GameController for a given GameName
*/
public GameController getGameController(String gameName) {
return getGameControllerByHash(gameName.hashCode());
}
/**
* finds the GameController for a given GameName hash code
*/
public GameController getGameControllerByHash(int gameNameHash) {
GameController gc = (GameController) gameControllers.get("" + gameNameHash);
if (gc == null)
log.error("no gamecontroller for gameNameHash: " + gameNameHash);
return gc;
}
/**
* Dynamically loads GameControllers
*/
private void loadGameControllers() {
log.info("loading GameControllers");
// grab all class files in the same directory as GameController
String baseClass = "com/hypefiend/javagamebook/server/controller/GameController.class";
File f = new File( this.getClass( ).getClassLoader().getResource(baseClass).getPath());
File[] files = f.getParentFile().listFiles( );
if (files == null) {
log.error("error getting GameController directory");
return;
}
for( int i = 0; ( i < files.length); i++) {
String file = files[i].getName( );
if (file.indexOf( ".class") == -1)
continue;
if (file.equals("GameController.class"))
continue;
try {
// grab the class
String controllerClassName = CONTROLLER_CLASS_PREFIX + file.substring(0, file.indexOf(".class"));
log.info("loading class: " + controllerClassName);
Class cl = Class.forName(controllerClassName);
// make sure it extends GameController
if (!GameController.class.isAssignableFrom(cl)) {
log.warn("class file does not extend GameController: " + file);
continue;
}
// get an instance and initialize
GameController gc = (GameController) cl.newInstance();
String gameName = gc.getGameName();
gc.init(this, getGameConfig(gameName));
// add to our controllers hash
gameControllers.put("" + gameName.hashCode(), gc);
log.info("loaded controller for gameName: " + gameName + ", hash: " + gameName.hashCode());
}
catch (Exception e) {
log.error("Error instantiating GameController from file: " + file, e);
}
}
}
/**
* pass the event on to the EventWriter
*/
public void writeEvent(GameEvent e) {
eventWriter.handleEvent(e);
}
/**
* returns the GameConfig object for the given gameName
*/
public GameConfig getGameConfig(String gameName) {
// todo: implement getGameConfig()
return null;
}
/**
* fetches the Player for a given playerId
*/
public static Player getPlayerById( String id) {
return (Player) playersByPlayerId.get(id);
}
/**
* fetches the Player for a given sessionId
*/
public static Player getPlayerBySessionId(String id) {
return (Player) playersBySessionId.get(id);
}
/**
* add a player to our lists
*/
public static void addPlayer(Player p) {
playersByPlayerId.put(p.getPlayerId(), p);
playersBySessionId.put(p.getSessionId(), p);
}
/**
* remove a player from our lists
*/
public static void removePlayer(Player p) {
playersByPlayerId.remove(p.getPlayerId());
playersBySessionId.remove(p.getPlayerId());
}
}// GameServer
采纳答案by david a.
The import of java.util.logging.Logger in your class seems to cause the problem (the compiler tries to compile against that one, altough it seems the intention was to use the log4j Logger class).
在您的类中导入 java.util.logging.Logger 似乎会导致问题(编译器尝试针对该问题进行编译,尽管其意图似乎是使用 log4j Logger 类)。
Try to remove the java.util.logging.Logger from the imports and recompile.
尝试从导入中删除 java.util.logging.Logger 并重新编译。
EDIT: Well, I just checked the original GameServer.java from the ZIP file linked in the page linked in the question. it does NOT contain any import of java.util.logging.Logger there. My guess is thus:
编辑:嗯,我刚刚从问题中链接的页面中链接的 ZIP 文件中检查了原始 GameServer.java。它不包含任何 java.util.logging.Logger 的导入。我的猜测是这样的:
- You do not have log4j on the classpath of your project
- You or your IDE tried to somehow organize the imports automatically. This ended up adding java.util.logging.Logger to the imports because no other class of that name was found in project's classpath.
- 您的项目的类路径上没有 log4j
- 您或您的 IDE 试图以某种方式自动组织导入。这最终将 java.util.logging.Logger 添加到导入中,因为在项目的类路径中找不到该名称的其他类。
So, add log4j to the classpath first, then remove the java.util.logging.Logger from the imports.
因此,首先将 log4j 添加到类路径,然后从导入中删除 java.util.logging.Logger。
回答by matt b
java.util.logging.Logger
does not have a warn()
method (although it does have a warning()
method).
java.util.logging.Logger
没有warn()
方法(尽管它确实有warning()
方法)。
However, org.apache.log4j.Logger
does indeed have a method named warn()
.
但是,org.apache.log4j.Logger
确实有一个名为warn()
.
Are you sure you are importing the correct classes?
您确定要导入正确的类吗?
回答by Guillaume
Could you please format your code ? Ti would be much more readable ...
你能格式化你的代码吗?Ti会更具可读性......
You are trying to call the error(String, String) method on an instance of java.util.logger.Logger. There is no such method. You should use Logger.log(Level.SEVERE, "mesage") instead, or use an instance of a log4J Logger. Check the import section of your source file ...
您正在尝试在 java.util.logger.Logger 的实例上调用 error(String, String) 方法。没有这样的方法。您应该使用 Logger.log(Level.SEVERE, "mesage") 代替,或者使用 log4J Logger 的实例。检查源文件的导入部分...