Cree un sistema de registro de Android Meituan Dianping front-end grande Guía de inicio de Logan

Tabla de contenido

prefacio

descripción general

Inicio rápido

Descarga el código fuente oficial

Abra el proyecto Logan Server con IDEA

Use Docker para descargar la imagen de MySQL e iniciar el contenedor

Ejecutando el servidor Logan

Modificar db.properties

Modificar log4j.properties

Configure Maven para usar Tomcat para ejecutar el programa

Acceder al servidor Logan

Ejecutar el sitio de Logan

Abra LoganSite con código visual

Requisitos medioambientales

Instalar

Ejecute la muestra de Logan-Android

Algunas soluciones de problemas de Github

La solicitud falló con el error de red #323.

Carga de archivos 404 #219 en el acceso a LoganSite.

¿Server SDK tiene tutoriales más detallados? #315


prefacio

Este artículo es del blog Yuque del autor. Hace unos días, descubrí que a algunos internautas les gustó y pensé que era útil, así que lo compartí. Después de todo, el SEO de CSDN es muy bueno.

Logan es un gran sistema de registro frontal lanzado por Meituan Dianping Group. El nombre es una combinación de Log y An, que significa el servicio de registro individual y también es el nombre del tío Wolverine.

descripción general

El código abierto de Logan es un conjunto completo de sistema de registro, que incluye recopilación y almacenamiento de registros, informes y análisis, y visualización. Proporcionamos cinco componentes, que incluyen la recopilación y el almacenamiento de registros de extremo a extremo, el SDK de iOS , el SDK de Android , el SDK web , el servidor de análisis y almacenamiento de registros back-end y la plataforma de análisis de registros LoganSite . Y se proporciona un complemento de Flutter .

Estructura general

Inicio rápido

Este no es el manejo de documentos oficiales, sino una enseñanza mano a mano para configurar y ejecutar el sistema de registro.Si solo lee los documentos, habrá algunos pasos que se atascarán y no se podrán resolver. Este artículo es un complemento de la documentación oficial y una respuesta a algunas preguntas sobre problemas de Github.

Si un trabajador quiere hacer un buen trabajo, primero debe afilar sus herramientas. Aquí, primero debe preparar las siguientes herramientas: entorno de desarrollo Linux (el sistema Windows también está disponible), Npm, Node.js, Yarn, Java8, IDEA, Docker, AndroidStudio y un teléfono Android.

Está bien, finge que estás listo y sigue leyendo.

Descarga el código fuente oficial

El primer paso, por supuesto, es descargar el código fuente. Si usar Github no es sencillo, puede consultar los siguientes métodos:

Se recomienda usar la herramienta SwitchHosts para administrar hosts y acceder a Github de manera más conveniente.

Cómo usar, agregue un host, complete con referencia al siguiente contenido:

Título: Aleatorio

Tipo: Remoto

URL: https://raw.hellogithub.com/hosts

Actualización automática: 1 hora es mejor

Fuente de la herramienta:

https://github.com/521xueweihan/GitHub520

https://github.com/oldj/SwitchHosts

Aquí descargo el código fuente al directorio local: /work/LogCenter/, lo descomprimo y, al mismo tiempo, también creo dos nuevos directorios, applogs y MySql, que se usarán más adelante.

Abra el proyecto Logan Server con IDEA

Utilice IDEA para abrir el proyecto Logan Sever para realizar una copia de seguridad, directorio: /work/LogCenter/Logan/Logan/Server.

Si observa la documentación oficial, aquí el oficial solo proporciona la instrucción sql para crear la tabla, dije que es muy conveniente, porque necesita usar la base de datos MySQL, así que aquí está la introducción del uso de Docker para construir el entorno MySQL , si no está interesado, salte este capítulo.

Use Docker para descargar la imagen de MySQL e iniciar el contenedor

No necesito decir cómo instalar Docker.

Enlace para verlo por sí mismo: Docker Tutorial | Rookie Tutorial

Abra la terminal de línea de comando, ingrese: docker pull mysql:5.7, presione Enter para ejecutar, de la siguiente manera:

pc:~$ docker pull mysql:5.7 
5.7: Extrayendo de biblioteca/mysql 
33847f680f63: Ya existe 
5cb67864e624: Ya existe 
1a2b594783f5 : Ya existe 
b30e406dd925: Ya existe 48901e306e4c: Ya existe 
603d2b7147fd 
: Ya existe 802aa684c1c4 
: Ya existe 
5b5a19178915: Tire completo 
f9ce7411c6e4: Extraer 
f51f6977d9b2 completo: Extraer completo 
aeb6b16ce012: Extraer 
resumen completo: sha256:be70d18aedc37927293e7947c8de41ae6490ecd4c79df1db40d1b5b5af7d9596 
Estado: Imagen más nueva descargada para mysql: 5.7 
docker.io/library/my sql :5.7

Espere a que se complete la descarga de la imagen. Ingrese: imágenes acoplables, vea la imagen de la siguiente manera:

pc:~$ docker imágenes 
REPOSITORIO ETIQUETA ID DE IMAGEN CREADA TAMAÑO 
kibana elastdocker-7.12.0 5ffdef382e6f Hace 2 días 1.05GB 
logstash elastdocker-7.12.0 97fe3f5ae942 Hace 2 días 971MB 
elasticsearch elastdocker-7.12.0 1ad2d4e4b508 Hace 2 días 830 MB 
elastic_certs último 1ad2d4e4b508 2 hace días 830MB 
elastic_keystore último 1ad2d4e4b508 hace 2 días 830MB
docker.elastic.co/beats/metricbeat 7.14.0-arm64 9dc075992137 Hace 13 días 1.19GB 
docker.elastic.co/beats/metricbeat 7.14.0 e3583bac930e Hace 13 días 517MB 
mysql 5.7 8cf625070931 Hace 3 semanas 448MB 
mysql último c60d96bd2b77 hace 3 semanas 514 MB 
docker.elastic.co/kibana/kibana 7.12.0 7a6b1047dd48 Hace 4 meses 1,05 GB 
docker.elastic.co/elasticsearch/elasticsearch 7.12.0 9337ed510a0c Hace 4 meses 830 MB
docker.elastic.co/logstash/logstash 7.12.0 c283394286f5 Hace 4 meses 971 MB  
jenkins v1.0.0 fab8efdd0aef Hace 14 meses 6.12 GB
jenkins test 1eb52b79643e Hace 14 meses 978 MB 
hub.c.163.com/public/ubuntu 16.04-tools 1196ea15dad6 Hace 4 años 336 MB

¿Míralo? Hay una línea: mysql 5.7 es la imagen que acabamos de descargar. A continuación, escribimos la configuración de docker-compose para iniciar el contenedor mysql:5.7.

Cree un nuevo mysql-5.7.yml en el directorio MySql y escriba el siguiente contenido:

versión: '2.0' 
servicios: 
    mysql: 
        container_name: "logan-mysql-5.7" 
        entorno: 
            MYSQL_ROOT_PASSWORD: "123456" 
        imagen: "mysql:5.7" 
        reiniciar: siempre 
        puertos: 
            - 3316:3306

Puedes entenderlo, si no lo entiendes, aprende primero: Docker Compose | Tutorial para principiantes

Ingrese al directorio /home/work/LogCenter/MySql desde la terminal de línea de comando

Ingrese el comando: docker-compose -f mysql-5.7.yml up -d

/home/work/LogCenter/MySql$ docker-compose -f mysql-5.7.yml up -d
Creating network "mysql_default" with the default driver
Creating logan-mysql-5.7 ... done

Ingrese el comando: docker-compose ps o docker ps para ver el contenedor iniciado, el estado Up significa que se está ejecutando.

/home/work/LogCenter/MySql$ docker-compose ps
     Name                   Command             State                 Ports              
-----------------------------------------------------------------------------------------
logan-mysql-5.7   docker-entrypoint.sh mysqld   Up      0.0.0.0:3316->3306/tcp, 33060/tcp

En este momento, use Navicat o DBeaver para conectarse y probar, consulte mysql-5.7.yml para obtener el número de puerto y la contraseña, y será exitoso.

A veces no es tan afortunado. El motivo de no poder conectarse suele ser una contraseña incorrecta, o el inicio de sesión remoto restringe la IP. En este momento, debe ingresar al contenedor MySQL y conectarse a la base de datos para modificarlo.

Referencia: docker despliega código de muestra mysql para conexión remota

El inicio de sesión es exitoso, cree una nueva base de datos llamada logan, ejecute el sql oficial y cree la tabla correspondiente. La instrucción sql correspondiente está en esta posición:

En este punto, el entorno de desarrollo de MySQL está configurado.

Ejecutando el servidor Logan

En este punto, finalmente puede ejecutarse. Logan Server es un proyecto administrado por Maven, por lo que al importar un proyecto, elija Maven.

Modificar db.properties

Modifique la IP a 1270.0.1, el puerto a 3316, la base de datos a logan, la cuenta a root y la contraseña a 123456, de acuerdo con su configuración de msql.

jdbc.driver=com.mysql.jdbc.Driver 
jdbc.url=jdbc:mysql://127.0.0.1:3316/logan?characterEncoding=UTF8&allowMultiQueries=true&socketTimeout=60000&autoReconnect=true 
jdbc.username=root 
jdbc.password=123456

Modificar log4j.properties

Modifique log4j.appender.R.File=/home/lb/work/LogCenter/applogs, que es el directorio creado en los preparativos anteriores.

log4j.rootLogger=ERROR,R,stdout 

log4j.appender.stdout=org.apache.log4j.ConsoleAppender 
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout 
log4j.appender.stdout.layout.ConversionPattern=%d % p [%c] - %m%n 

log4j.appender.R=org.apache.log4j.DailyRollingFileAppender 
log4j.appender.R.File=/home/lb/work/LogCenter/applogs/logan.log 
log4j.appender.R .layout=org.apache.log4j.PatternLayout 
log4j.appender.R.layout.ConversionPattern=%d-[TS] %p %t %c - %m%n

Configure Maven para usar Tomcat para ejecutar el programa

En este momento, el programa aún no se puede ejecutar y debe configurarse.

Haga clic en Agregar configuración--> + Maven + Aceptar a su vez.

Complete la línea de comando, complete tomcat: ejecutar y haga clic en Aceptar.

Luego puede hacer clic en el botón del triángulo verde para ejecutar el programa.

Intentamos ejecutarlo e informamos de un error. Efectivamente, era demasiado joven y demasiado simple.

Se informó este error: no se pudo ejecutar el objetivo org.apache.maven.plugins:maven-compiler-plugin:3.1:compilar (compilación predeterminada) en el proyecto logan-web: compilación de error fatal

Después de algunas búsquedas, se dijo que fue causado por versiones de Java inconsistentes:

Resolver Error al ejecutar el objetivo org.apache.maven.plugins:maven-compiler-plugin:3.7.0:compile_Share y pasar valor-CSDN blog

Bueno, verifique pom.xml, no hay una configuración de versión de Java. Luego vaya a Archivo-->Estructura del proyecto y configure el SDK del proyecto a la versión 1.8.

Ejecútalo de nuevo y parece que funcionó.

Recuerde la dirección Url de Sever en la imagen: http://localhost:8080/logan-web , se usará de inmediato.

Acceder al servidor Logan

Abra el navegador y visite la URL del servidor impresa por la consola: http://localhost:8080/logan-web , pero se informa un error, ¿está cansado?

Mire la salida de la consola nuevamente:

[INFO] 
[INFO] --------------------< com.meituan.logan:logan-web >------------- -------- 
[INFO] Construyendo logan-web 1.0-INSTANTÁNEA 
[INFO] ----------------------------- ---[ guerra ]--------------------------------- 
[INFO] 
[INFO] >>> tomcat- maven-plugin:1.1:ejecutar (predeterminado-cli) > compile @ logan-web >>> 
[INFO] 
[INFO] --- maven-resources-plugin:2.5:resources (default-resources) @ logan-web -- - 
[depurar] ejecutar contextualizar 
[INFO] Usando la codificación 'UTF-8' para copiar recursos filtrados. 
[INFO] Copiando 7 recursos 
[INFO] 
[INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @ logan-web --- 
[INFO] Nada que compilar - todas las clases están actualizadas 
[ INFORMACIÓN]
[INFO] <<< tomcat-maven-plugin:1.1:ejecutar (cli por defecto) < compile @ logan-web <<< 
[INFO] 
[INFO] 
[INFO] --- tomcat-maven-plugin:1.1:ejecutar (predeterminado-cli) @ logan-web --- 
[INFO] Ejecutando la guerra en http://localhost:8080/logan-web 
[INFO] Usando la configuración del servidor Tomcat existente en /home/work/IdeaProjects/Logan-master/Logan /Server/target/tomcat 
13 de octubre de 2021 6:39:29 下午 org.apache.catalina.startup.Embedded start
信息: Iniciando servidor tomcat 
13 de octubre de 2021 6:39:29 org.apache.catalina.core .StandardEngine start
信息: Inicio del motor Servlet: Apache Tomcat/6.0.29
八月 13, 2021 6:39:30 下午 org.apache.catalina.core.ApplicationContext log 
信息: Inicialización de Spring root WebApplicationContext
*********post initializaiton 
*** ****** después de la inicialización
13 de agosto de 2021 6:39:32 p. m. Información de registro de org.apache.catalina.core.ApplicationContext 
: inicialización de Spring DispatcherServlet 'mvc-dispatcher' 
13 de agosto de 2021 6:39:32 p. m. org.apache.coyote.http11.Http11Protocol init 
información: inicialización de Coyote HTTP/1.1 en http-8080 
13 de 
agosto de 2021 6:39:32 p 
. 28 p. m. org.apache.jasper.compiler.JDTCompiler$1 findType 
Crítico: error de compilación 
org.eclipse.jdt.internal.compiler.classfmt.ClassFormatException 
	en org.apache.jasper.compiler.JDTCompiler$1.findType(JDTCompiler.java:163) 
	. .classfmt.ClassFileReader.<inicio>(ClassFileReader.java:342)
	en org.apache.jasper.compiler.JDTCompiler$1.findType(JDTCompiler.java:206) 
	en org.eclipse.jdt.internal.compiler.lookup.LookupEnvironment.askForType(LookupEnvironment.java:96) 
	en org.eclipse.jdt. internal.compiler.lookup.UnresolvedReferenceBinding.resolve(UnresolvedReferenceBinding.java:49) 
	en org.Eclipse.jdt.internal.compiler.lookup.BinaryTypeBinding.resolveType(BinaryTypeBinding.java:97) 
	en org.Eclipse.jdt.internal.compiler. lookup.PackageBinding.getTypeOrPackage(PackageBinding.java:167) 
	en org.Eclipse.jdt.internal.compiler.lookup.Scope.getType(Scope.java:2187) 
	en org.eclipse.jdt.internal.compiler.ast.TypeDeclaration. resolver(TipoDeclaración.java:974)
	en org.eclipse.jdt.internal.compiler.ast.TypeDeclaration.resolve(TypeDeclaration.java:1164)  
	en org.eclipse.jdt.internal.compiler.ast .Declaración de unidad de compilación.resolve(Declaración de unidad de compilación.java:366)
	en org.eclipse.jdt.internal.compiler.Compiler.process(Compiler.java:623) 
	en org.eclipse.jdt .internal.compiler.Compiler.compile(Compiler.java:392) 
	en org.apache.jasper.compiler.JDTCompiler.generateClass(JDTCompiler.java:429) 
	en org.apache.jasper.compiler.Compiler.compile(Compiler.java :349) 
	en org.apache.jasper.compiler.Compiler.compile(Compiler.java:327) 
	en org.apache.jasper.compiler.Compiler.compile(Compiler.java:314) 
	en org.apache.jasper.JspCompilationContext. compile(JspCompilationContext.java:592) 
	en org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:317)
	en org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:313)  
	en org.apache.jasper.servlet.JspServlet.service(JspServlet.java:260) 
	en javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
	en org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290) 
	en org.apache.catalina.core.ApplicationFilterChain.doFilter (ApplicationFilterChain.java:206) 
	en com.meituan.logan.web.filter.CORSFilter.doFilter(CORSFilter.java:47) 
	en org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) 
	en org. apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
	en org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) 
	en org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter. java: 119) 
	en org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
	en org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
	en org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233) 
	en org.apache.catalina.core.StandardContextValve.invoke (StandardContextValve.java:191) 
	en org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127) 
	en org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) 
	en org.apache. catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) 
	en org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol. Java: 588) 
	en org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java: 298)
	en org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:857) 
	en org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489) 
	en java.lang.Thread.run (Thread.java:748)

八月 13, 2021 6:40:28 下午 org.apache.catalina.core.StandardWrapperValve invoque
严重: Servlet.service() para servlet jsp lanzó una excepción 
org.apache.jasper.JasperException: No se pudo clase de compilación para JSP: 

se produjo un error en la línea: 1 en el archivo java generado 
No se puede resolver el tipo java.io.ObjectInputStream. Se hace referencia indirecta desde los archivos .class requeridos 

Stacktrace: 
	en org.apache.jasper.compiler.DefaultErrorHandler.javacError(DefaultErrorHandler.java:92) 
	en org.apache.jasper.compiler.ErrorDispatcher.javacError(ErrorDispatcher.java:330) 
	en org.apache.jasper.compiler.JDTCompiler.generateClass(JDTCompiler.java:439)
	en org.apache.jasper.compiler.Compiler.compile(Compiler.java:349) 
	en org.apache.jasper.compiler.Compiler.compile(Compiler.java:327) 
	en org.apache.jasper.compiler.Compiler.compile (Compiler.java:314) 
	en org.apache.jasper.JspCompilationContext.compile(JspCompilationContext.java:592) 
	en org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:317) 
	en org.apache.jasper. servlet.JspServlet.serviceJspFile(JspServlet.java:313) 
	en org.apache.jasper.servlet.JspServlet.service(JspServlet.java:260) 
	en org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
	en javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
	en org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290) 
	en com.meituan.logan.web.filter.CORSFilter.doFilter(CORSFilter.java:47) 
	en org.apache.catalina.core.ApplicationFilterChain .internalDoFilter(ApplicationFilterChain.java:235) 
	en org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
	en org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) 
	en org. springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) 
	en org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
	en org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)  
	en org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233) 
	en org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve. Java: 191)
	en org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127) 
	en org.apache.catalina.valves.ErrorReportValve.invoke (ErrorReportValve.java:102) 
	en org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) 
	en org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298) 
	en org.apache. coyote.http11.Http11Processor.process(Http11Processor.java:857) 
	en org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588) 
	en org.apache.tomcat.util.net.JIoEndpoint$Worker. ejecutar (JIoEndpoint.java:489) 
	en java.lang.Thread.run(Thread.java:748)

Es genial, realmente no es un desarrollo de servidor, ejecutar un proyecto es muy difícil.

Búsqueda de Du Niang: org.eclipse.jdt.internal.compiler.classfmt.ClassFormatException

Dicha versión de Tomcat es demasiado baja:

Excepción de inicio de Tomcat: org.eclipse.jdt.internal.compiler.classfmt.ClassFormatException

Muy bien, Todopoderoso Du Niang. Intente actualizar la versión de Tomcat. Configure el complemento tomcat7 en pom.xml.

<plugin> 
        <groupId>org.apache.tomcat.maven</groupId> 
        <artifactId>tomcat7-maven-plugin</artifactId> 
        <version>2.2</version> 
        <configuration> 
        <port>8888</port> 
        </ configuración> 
</complemento>

Después de agregar la configuración, haga clic en Sincronización de Maven.

Luego edite la línea de comando de Maven a: tomcat7: ejecutar, haga clic en Aceptar para guardar.

Entonces solo ejecútalo.

Por supuesto, puede ejecutarlo directamente a través del complemento Maven Tomcat7 a la derecha, como desee.

El uso de Tomcat7 puede causar los siguientes errores.


13 de junio de 2021 6:20:35下午 org.apache.catalina.core.StandardService startInternal信息
: 
iniciando el servicio Motor de servlet: Apache Tomcat/7.0.47
八月 13, 2021 6:20:37 下午 org.apache.catalina.startup.ContextConfig processAnnotationsJar
严重: No se puede procesar la entrada de Jar [module-info.class] desde Jar [jar:file :/home/nxg/.m2/repository/com/fasterxml/jackson/core/jackson-annotations/2.10.1/jackson-annotations-2.10.1.jar!/] para anotaciones 
org.apache.tomcat.util.bcel .classfile.ClassFormatException: etiqueta de byte no válida en el grupo constante: 19 
	en org.apache.tomcat.util.bcel.classfile.ConstantPool.<init>(ConstantPool.java:60) 
	en org.apache.tomcat.util.bcel.classfile.Constant.readConstant(Constant.java:133)
	en org.apache.tomcat.util.bcel.classfile.ClassParser.readConstantPool(ClassParser.java:209) 
	en org.apache.tomcat.util.bcel.classfile.ClassParser.parse(ClassParser.java:119) 
	en org.apache .catalina.startup.ContextConfig.processAnnotationsStream(ContextConfig.java:2134) 
	en org.apache.catalina.startup.ContextConfig.processAnnotationsJar(ContextConfig.java:2010) 
	en org.apache.catalina.startup.ContextConfig.processAnnotationsUrl(ContextConfig.java :1976) 
	en org.apache.catalina.startup.ContextConfig.processAnnotations(ContextConfig.java:1961)  
	en org. apache.catalina.startup.ContextConfig.webConfig(ContextConfig.java:1319)
	en org.apache.catalina.startup.ContextConfig.configureStart(ContextConfig.java:878) 
	en org.apache.catalina.startup. ContextConfig.lifecycleEvent(ContextConfig.java:376)
	en org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:119) 
	en org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:90) 
	en org.apache.catalina.core.StandardContext.startInternal (StandardContext.java:5322) 
	en org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) 
	en org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1559) 
	en org. apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1549) 
	en java.util.concurrent.FutureTask.run(FutureTask.java:266)  
	en java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
	en java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor. java:624) 
	en java.lang.Thread.run(Thread.java:748)

Baidu buscó artículos relacionados diciendo que esto no tiene ningún efecto. La prueba real verifica que este informe de error no tiene ningún efecto, así que sáltelo primero.

Cuando todavía puede encontrar los siguientes problemas.

提示:Error al ejecutar el objetivo org.codehaus.mojo:tomcat-maven-plugin:1.1:run (default-cli) en el proyecto logan-web: No se pudo iniciar Tomcat

El método también es intentar ejecutar con la versión tomcat7.

El navegador actualiza la página web y muestra: hola, logan, se siente genial, es este tipo de sensación.

Ejecutar el sitio de Logan

Después de ejecutar el backend, es el turno del frontend. Preparar el entorno de desarrollo de Node.js, Npm, Yarn, etc. son indispensables, aquí hay una pequeña mención de los hoyos encontrados.

Npm es muy lento, debe configurar la fuente de espejo de Taobao. Vea el tutorial: npm reemplazado con fuente espejo Taobao y cnpm

No use npm install para configurar la fuente del espejo, use este método directamente:

registro del conjunto de configuración de npm https://registry.npm.taobao.org

Abra LoganSite con código visual

Abra LoganSite Backup usando Visual Code.

Requisitos medioambientales

Nodo: ^10.15.3 hilo: ^1.15.2 o npm ^6.12.0

Instalar

ejecutar localmente

Cree un archivo en el directorio raíz de LoganSite .env.developmenty especifique la variable de entorno API_BASE_URL en él para:

API_BASE_URL= http://localhost:8080/logan-web

Así es, esta URL es la URL impresa en la consola en Logan Server.

Luego ejecute el siguiente comando en el directorio raíz de LoganSite, o ejecute el comando cd para ingresar primero al directorio raíz de LoganSite.

$ hilo 
$ comienzo de hilo

Por qué no se recomienda usar npm, bueno, quien lo usa lo sabe.

Nota: .env.developmentdebe colocarse en el directorio raíz de LoganSite y la URL completa debe ser la URL impresa en la consola en Logan Server.

Si encuentra el mismo problema que Github Issue:

1. Después de que LoganSite se inicia, muestra un error: error de solicitud Error de red #323 .

2. Después de que LoganSite se inicia, muestra un error: 404 #219 cuando el archivo se carga cuando LoganSite está conectado .

Por favor verifique las modificaciones como arriba.

F12 abre la consola, hace clic en la pestaña Red, generalmente:

http://localhost:8080/logan-web/logan/latest.json

Esta solicitud de URL informa de un error, puede ver si este es el problema.

Ejecute la muestra de Logan-Android

AndroidStudio importa directamente el proyecto Logan-Android. Debido a que se basa en el código fuente del SDK de Android, la ruta del NDK debe configurarse para la compilación y la versión del NDK debe ser inferior o igual a 16.1.4479499. Agregue ndk.dir=/work/android/android-ndk-r15c a local.properties en el directorio raíz de Logan-Android y complete su ruta de NDK según sea necesario.

## Este archivo *NO* debe registrarse en los sistemas de control de versiones, 
# ya que contiene información específica de su configuración local. 
# 
# Ubicación del SDK. Esto solo lo usa Gradle. 
# Para la personalización al usar un Sistema de control de versiones, lea la 
nota de encabezado #. 
#Mié 11 de agosto 18:04:17 CST 2021 
sdk.dir=/work/android/android-sdk-linux 
ndk.dir=/work/android/android-ndk-r15c

Luego modifique la URL aquí en test.logan.dianping.com.logan.RealSendLogRunnable como se muestra a continuación:

El código completo es el siguiente:

/*
 * Copyright (c) 2018-present, 美团点评
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in
 * all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 * THE SOFTWARE.
 */

package test.logan.dianping.com.logan;

import android.text.TextUtils;
import android.util.Log;

import com.dianping.logan.SendLogRunnable;

import org.json.JSONException;
import org.json.JSONObject;

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.ProtocolException;
import java.net.URL;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;

import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLSession;

public class RealSendLogRunnable extends SendLogRunnable {

    private static final String TAG = "RealSendLogRunnable";

    private String mUploadLogUrl = "http://192.168.1.139:8080/logan-web/logan/upload.json";

    @Override
    public void sendLog(File logFile) {
        boolean success = doSendFileByAction(logFile);
        Log.d("上传日志测试", "日志上传测试结果:" + success);
        // Must Call finish after send log
        finish();
        if (logFile.getName().contains(".copy")) {
            logFile.delete();
        }
    }

    public void setIp(String ip) {
        mUploadLogUrl = "http://" + ip + ":8080/logan-web/logan/upload.json";
    }

    private HashMap<String, String> getActionHeader() {
        HashMap<String, String> map = new HashMap<>();
        map.put("Content-Type", "binary/octet-stream"); //二进制上传
        map.put("client", "android");
        return map;
    }

    /**
     * 主动上报
     */
    private boolean doSendFileByAction(File logFile) {
        boolean isSuccess = false;
        try {
            FileInputStream fileStream = new FileInputStream(logFile);
            byte[] backData = doPostRequest(mUploadLogUrl, fileStream, getActionHeader());
            isSuccess = handleSendLogBackData(backData);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (JSONException e) {
            e.printStackTrace();
        }
        return isSuccess;
    }

    private byte[] doPostRequest(String url, InputStream inputData, Map<String, String> headerMap) {
        Log.i(TAG, "doPostRequest: url " + url);
        int statusCode = -1;
        byte[] data = null;
        OutputStream outputStream = null;
        InputStream inputStream = null;
        HttpURLConnection c = null;
        ByteArrayOutputStream back;
        byte[] Buffer = new byte[2048];
        try {
            java.net.URL u = new URL(url);
            c = (HttpURLConnection) u.openConnection();
            if (c instanceof HttpsURLConnection) {
                ((HttpsURLConnection) c).setHostnameVerifier(new HostnameVerifier() {
                    @Override
                    public boolean verify(String hostname, SSLSession session) {
                        return true;
                    }
                });
            }
            Set<Map.Entry<String, String>> entrySet = headerMap.entrySet();
            for (Map.Entry<String, String> tempEntry : entrySet) {
                c.addRequestProperty(tempEntry.getKey(), tempEntry.getValue());
            }
            c.setReadTimeout(15000);
            c.setConnectTimeout(15000);
            c.setDoInput(true);
            c.setDoOutput(true);
            c.setRequestMethod("POST");
            outputStream = c.getOutputStream();
            int i;
            while ((i = inputData.read(Buffer)) != -1) {
                outputStream.write(Buffer, 0, i);
            }
            outputStream.flush();
            statusCode = c.getResponseCode();
            if (statusCode == 200) {
                back = new ByteArrayOutputStream();
                inputStream = c.getInputStream();
                while ((i = inputStream.read(Buffer)) != -1) {
                    back.write(Buffer, 0, i);
                }
                data = back.toByteArray();
            }
        } catch (ProtocolException e) {
            e.printStackTrace();
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (outputStream != null) {
                try {
                    outputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (inputStream != null) {
                try {
                    inputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (inputData != null) {
                try {
                    inputData.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (c != null) {
                c.disconnect();
            }
        }
        Log.d(TAG, "log send completed, http statusCode : " + statusCode);
        return data;
    }

    /**
     * 处理上传日志接口返回的数据
     */
    private boolean handleSendLogBackData(byte[] backData) throws JSONException {
        boolean isSuccess = false;
        if (backData != null) {
            String data = new String(backData);
            if (!TextUtils.isEmpty(data)) {
                JSONObject jsonObj = new JSONObject(data);
                if (jsonObj.optBoolean("success", false)) {
                    isSuccess = true;
                }
            }
        }
        return isSuccess;
    }
}

Nota: La IP y el número de puerto deben reemplazarse con la IP y el número de puerto del servidor Logan correspondiente. La consola del servidor Logan aquí imprime: http://localhost:8080/logan-web , pero la muestra de Logan-Android se está ejecutando en otro El dispositivo está disponible, por lo que el localhost aquí debe cambiarse a la IP real del entorno operativo del servidor Logan (LAN o IP de la red pública del servidor), y asegúrese de

El dispositivo que ejecuta Logan-Android Sample puede acceder a la IP real de Logan Server.

Hay otro lugar que también se recomienda modificar. El método loganSendByDefault de test.logan.dianping.com.logan.MainActivity. La URL del servidor Logan que se llena aquí es la plataforma oficial de Meituan Dianping, pero ya no es accesible. Reemplazar con su propia prueba conveniente.

el código se muestra a continuación:

    private void loganSendByDefault() {
        String buildVersion = "";
        String appVersion = "";
        try {
            PackageInfo pInfo = getPackageManager().getPackageInfo(getPackageName(), 0);
            appVersion = pInfo.versionName;
            buildVersion = String.valueOf(pInfo.versionCode);
        } catch (PackageManager.NameNotFoundException e) {
            e.printStackTrace();
        }
        //final String url = "https://openlogan.inf.test.sankuai.com/logan/upload.json";
        final String url = "http://192.168.1.139:8080部分/logan-web/logan/upload.json";
        SimpleDateFormat dataFormat = new SimpleDateFormat("yyyy-MM-dd");
        final String date = dataFormat.format(new Date(System.currentTimeMillis()));
        Logan.s(url, date, "1", "logan-test-unionid", "deviceId", buildVersion, appVersion, new SendLogCallback() {
            @Override
            public void onLogSendCompleted(int statusCode, byte[] data) {
                final String resultData = data != null ? new String(data) : "";
                Log.d(TAG, "日志上传结果, http状态码: " + statusCode + ", 详细: " + resultData);
            }
        });
    }

Cuando esté listo, ejecute Logan-Android Sample y enfatice nuevamente que el dispositivo debe poder acceder a la IP real del Logan Server (la misma LAN o el servidor usa una IP pública), y luego haga clic en todos los botones en la interfaz de la aplicación. Si ve un registro similar al siguiente, significa que el registro se cargó Funcionó.

2021-08-16 11:55:58.202 17982-17998/test.logan.dianping.com.logan D/test.logan.dianping.com.logan.MyApplication: clogan > cmd : clogan_init | código: -1010 
2021-08-16 11:55:58.202 17982-17998/test.logan.dianping.com.logan D/LoganThread: Logan escribe inicio 
2021-08-16 11:55:58.208 17982-17998/test. logan.dianping.com.logan D/test.logan.dianping.com.logan.MyApplication: clogan > cmd : clogan_open | código: -2010 
2021-08-16 11:55:58.209 17982-17998/test.logan.dianping.com.logan D/test.logan.dianping.com.logan.MyApplication: clogan > cmd : clogan_write | código: -4010 
2021-08-16 11:55:58.209 17982-17998/test.logan.dianping.com.logan D/LoganThread: Logan escribe inicio 
2021-08-16 11:55:58.209 17982-17998/test. logan.dianping.com.logan D/LoganThread: inicio de escritura de Logan
2021-08-16 11:55:58.309 17982-17999/test.logan.dianping.com.logan I/mali_so: [Archivo]: hardware/arm/maliT760/driver/product/base/src/mali_base_kbase.c; [Línea]: 978; [Función]: base_context_deal_with_version_affairs_rk_ext; 
    arm_release_ver de este mali_so es 'r14p0-01rel0', rk_so_ver es '5@0'. 
2021-08-16 11:55:58.310 17982-17999/test.logan.dianping.com.logan D/mali_so: [Archivo]: hardware/arm/maliT760/driver/product/base/src/mali_base_kbase.c; [Línea]: 983; [Función]: base_context_deal_with_version_affairs_rk_ext; 
    el proceso actual NO es sf, para rescatar. 
2021-08-16 11:55:58.317 17982-17999/test.logan.dianping.com.logan I/OpenGLRenderer: EGL inicializado, versión 1.4 
2021-08-16 11:55:58.317 17982-17999/test.logan. dianping.com.logan D/OpenGLRenderer: Comportamiento de intercambio 1
2021-08-16 11:55:58.328 17982-17999/test.logan.dianping.com.logan D/mali_winsys: EGLint new_window_surface(egl_winsys_display*, void*, EGLSurface, EGLConfig, egl_winsys_surface**, egl_color_buffer_format*, EGLBoole una) vuelve 0x3000 
2021-08-16 11:56:00.225 17982-18031/test.logan.dianping.com.logan D/test.logan.dianping.com.logan.MainActivity: veces: 0 
2021-08-16 11:56: 00.225 17982-17998/test.logan.dianping.com.logan D/LoganThread: Logan escribe inicio 
2021-08-16 11:56:00.231 17982-18031/test.logan.dianping.com.logan D/test.logan. dianping.com.logan.MainActivity: veces: 1 

2021-08-16 11:56:01.339 17982-18035/test.logan.dianping.com.logan I/RealSendLogRunnable: doPostRequest: url http://192.168.1.139:8080 /logan-web/logan/upload.json
2021-08-16 11:56:01.342 17982-18035/test.logan.dianping.com.logan D/NetworkSecurityConfig: No se especificó ninguna configuración de seguridad de red, usando la plataforma predeterminada 
2021-08-16 11:56:01.608 17982-18035/ test.logan.dianping.com.logan D/RealSendLogRunnable: envío de registro completado, http statusCode: 200 
2021-08-16 11:56:01.609 17982-18035/test.logan.dianping.com.logan D/上传日志测试:日志上传测试结果:false 
2021-08-16 11:56:01.793 17982-17998/test.logan.dianping.com.logan D/LoganSubproceso: Logan envía inicio 
2021-08-16 11:56:01.793 17982-17 998/ test.logan.dianping.com.logan D/LoganThread: preparar archivo de registro 
2021-08-16 11:56:01.794 17982-17998/test.logan.dianping.com.logan D/LoganThread: inicio de descarga de Logan
2021-08-16 11:56:01.799 17982-18035/test.logan.dianping.com.logan I/SendLogDefaultEjecutable: doPostRequest: url = http://192.168.1.139:8080/logan-web/logan/upload.json 
2021-08-16 11:56:01.848 17982-18035/test.logan.dianping.com.logan D/SendLogDefaultRunnable: envío de registro completado, http statusCode: 200 
2021-08-16 11:56:01.848 17982-18035/test .logan.dianping.com.logan D/test.logan.dianping.com.logan.MainActivity: registro de resultado de carga, código de estado http: 200, detalles: {"code":200,"msg":null,"data" :"/logan/downing?name=1_deviceId_1629043200000_23eb244a-7a65-4934-9095-26b2f346de43.log"}

Veamos la verificación de la base de datos:

Después de encontrar dos entradas de registro, vuelva a http://localhost:3000/ , presione F5 para actualizar y, de hecho, vea dos entradas de registro.

Haga clic para ver los detalles del registro, no pasa nada.

Gracias por leer, este es el final de la guía de inicio paso a paso de Logan, deje un mensaje si tiene más preguntas.

Algunas soluciones de problemas de Github

Solicitud fallida Error de red #323 .

Solución:

Cree un archivo en el directorio raíz de LoganSite .env.developmenty especifique la variable de entorno API_BASE_URL en él para:

API_BASE_URL= http://localhost:8080/logan-web

Tenga en cuenta que esta API_BASE_URL es la URL impresa en la consola en Logan Server, como se muestra en la figura a continuación;

Nota: .env.developmentasegúrese de colocarlo en el directorio raíz de LoganSite y verifique si la variable BASE_URL en src/common/api.js apunta a la variable configurada en .env.development.

const BASE_URL = proceso.defineEnv.API_BASE_URL; 
constante API_TIME_OUT = 30000; 
let solicitudes pendientes = []; 

// instancia de axios 
const instancia = axios.create({ 
  baseURL: BASE_URL, 
  timeout: API_TIME_OUT, 
  withCredentials: true 
});

Carga del archivo 404 #219 en el acceso a LoganSite .

Solución: Igual que #323.

¿Server SDK tiene tutoriales más detallados? #315

Solución: consulte el contenido del capítulo Ejecución de Logan Server en este artículo y haga clic en mí para saltar .

Supongo que te gusta

Origin blog.csdn.net/xiangang12202/article/details/123078275
Recomendado
Clasificación