java.util.logging.Logger和log4j [英] java.util.logging.Logger and log4j

查看:87
本文介绍了java.util.logging.Logger和log4j的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试从这里编译代码: http://www.brackeen.com/ javagamebook / #download (第6章)我遇到了麻烦。我不明白 java.util.logging.Logger 和log4j是如何协同工作的,但这似乎是个问题。我得到的错误都在 log.error() log.warn()方法调用上。

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.

以下是NetBeans的输出:

Here is the output from 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:bret@hypefiend.com">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


推荐答案

在你的类中导入java.util.logging.Logger似乎导致了问题(编译器试图针对那个编译,尽管似乎意图是使用log4j Logger类)。

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。

Try to remove the java.util.logging.Logger from the imports and recompile.

编辑:
好​​吧,我刚从问题中链接的页面中链接的ZIP文件中检查了原始的GameServer.java。它不包含任何java.util.logging.Logger的导入。我的猜测是这样的:

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:


  • 你的项目的类路径上没有log4j

  • 你或者您的IDE尝试以某种方式自动组织导入。最后将java.util.logging.Logger添加到导入中,因为在项目的类路径中找不到该名称的其他类。

因此,首先将log4j添加到类路径中,然后从导入中删除java.util.logging.Logger。

So, add log4j to the classpath first, then remove the java.util.logging.Logger from the imports.

这篇关于java.util.logging.Logger和log4j的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆