Vue.js
ByteHide Logger integrates with Vue.js applications through plugins and provides component-level logging capabilities.
Installation
Bash
npm install @bytehide/logger vuenpm install @bytehide/logger vuePlugin Setup
JavaScript
// plugins/logger.js
import { Log } from '@bytehide/logger';
export default {
install(app, options) {
Log.configure({
projectToken: options.projectToken || process.env.VUE_APP_BYTEHIDE_TOKEN,
logLevel: 'info'
});
app.config.globalProperties.$log = Log;
app.provide('logger', Log);
Log.info('Vue.js logger plugin initialized');
}
};// plugins/logger.js
import { Log } from '@bytehide/logger';
export default {
install(app, options) {
Log.configure({
projectToken: options.projectToken || process.env.VUE_APP_BYTEHIDE_TOKEN,
logLevel: 'info'
});
app.config.globalProperties.$log = Log;
app.provide('logger', Log);
Log.info('Vue.js logger plugin initialized');
}
};App Configuration
JavaScript
// main.js
import { createApp } from 'vue';
import App from './App.vue';
import LoggerPlugin from './plugins/logger';
const app = createApp(App);
app.use(LoggerPlugin, {
projectToken: process.env.VUE_APP_BYTEHIDE_TOKEN
});
app.mount('#app');// main.js
import { createApp } from 'vue';
import App from './App.vue';
import LoggerPlugin from './plugins/logger';
const app = createApp(App);
app.use(LoggerPlugin, {
projectToken: process.env.VUE_APP_BYTEHIDE_TOKEN
});
app.mount('#app');Component Usage
VUE
<template>
<div>
<button @click="handleClick">Click me</button>
</div>
</template>
<script>
export default {
name: 'MyComponent',
mounted() {
this.$log.info('MyComponent mounted');
},
beforeUnmount() {
this.$log.info('MyComponent will unmount');
},
methods: {
handleClick() {
this.$log.info('Button clicked', {
context: { component: 'MyComponent', action: 'click' }
});
}
}
};
</script><template>
<div>
<button @click="handleClick">Click me</button>
</div>
</template>
<script>
export default {
name: 'MyComponent',
mounted() {
this.$log.info('MyComponent mounted');
},
beforeUnmount() {
this.$log.info('MyComponent will unmount');
},
methods: {
handleClick() {
this.$log.info('Button clicked', {
context: { component: 'MyComponent', action: 'click' }
});
}
}
};
</script>Composition API
VUE
<script setup>
import { inject, onMounted, onUnmounted } from 'vue';
const logger = inject('logger');
onMounted(() => {
logger.info('Component mounted with Composition API');
});
onUnmounted(() => {
logger.info('Component unmounted');
});
const handleSubmit = () => {
logger.info('Form submitted', {
context: { form: 'contact-form' }
});
};
</script><script setup>
import { inject, onMounted, onUnmounted } from 'vue';
const logger = inject('logger');
onMounted(() => {
logger.info('Component mounted with Composition API');
});
onUnmounted(() => {
logger.info('Component unmounted');
});
const handleSubmit = () => {
logger.info('Form submitted', {
context: { form: 'contact-form' }
});
};
</script>Error Handling
JavaScript
// main.js
app.config.errorHandler = (error, instance, info) => {
Log.error('Vue error handler caught error', {
context: {
componentName: instance?.$options.name,
errorInfo: info
}
}, error);
};// main.js
app.config.errorHandler = (error, instance, info) => {
Log.error('Vue error handler caught error', {
context: {
componentName: instance?.$options.name,
errorInfo: info
}
}, error);
};Router Integration
JavaScript
// router/index.js
import { createRouter } from 'vue-router';
import { Log } from '@bytehide/logger';
const router = createRouter({
// ... routes
});
router.beforeEach((to, from, next) => {
Log.info('Route navigation', {
context: {
from: from.path,
to: to.path
}
});
next();
});
export default router;// router/index.js
import { createRouter } from 'vue-router';
import { Log } from '@bytehide/logger';
const router = createRouter({
// ... routes
});
router.beforeEach((to, from, next) => {
Log.info('Route navigation', {
context: {
from: from.path,
to: to.path
}
});
next();
});
export default router;Vuex/Pinia Integration
JavaScript
// store/index.js (Vuex)
import { Log } from '@bytehide/logger';
const store = createStore({
mutations: {
SET_USER(state, user) {
Log.info('User state updated', {
context: { userId: user.id }
});
state.user = user;
}
},
actions: {
async loginUser({ commit }, credentials) {
Log.info('Login attempt started');
try {
const user = await login(credentials);
commit('SET_USER', user);
Log.identify(user.id, user.email);
Log.info('Login successful');
return user;
} catch (error) {
Log.error('Login failed', {
context: { email: credentials.email }
}, error);
throw error;
}
}
}
});// store/index.js (Vuex)
import { Log } from '@bytehide/logger';
const store = createStore({
mutations: {
SET_USER(state, user) {
Log.info('User state updated', {
context: { userId: user.id }
});
state.user = user;
}
},
actions: {
async loginUser({ commit }, credentials) {
Log.info('Login attempt started');
try {
const user = await login(credentials);
commit('SET_USER', user);
Log.identify(user.id, user.email);
Log.info('Login successful');
return user;
} catch (error) {
Log.error('Login failed', {
context: { email: credentials.email }
}, error);
throw error;
}
}
}
});Best Practices
Vue.js Best Practices
- Use plugins for global logger configuration
- Provide logger instance through dependency injection
- Log component lifecycle events and user interactions
- Integrate with Vue Router for navigation logging